Meilisearch · 21 min read · Oct 26, 2025

Como Instalar e Configurar Meilisearch no Debian 12

Meilisearch é um mecanismo de busca de código aberto escrito na linguagem Rust. Sendo escrito em Rust, requer menos recursos para funcionar e pode ser executado usando um único binário de linha de comando. O processo de instalação é mais simples do que os mecanismos de busca alternativos e requer menos etapas. Seus recursos incluem correspondência difusa e indexação sem esquema. Ele vem com uma interface web para fins de demonstração. Pode ser integrado a várias aplicações web através de várias bibliotecas disponíveis em várias linguagens como JavaScript, Python, PHP, Ruby, etc.

Neste tutorial, você aprenderá como instalar o Meilisearch em produção em um servidor Debian 12 e usá-lo para realizar várias buscas simples.

Pré-requisitos

  • Um servidor rodando Debian 12 com um mínimo de 2GB de RAM.

  • Um usuário não-root com privilégios sudo.

  • O Firewall descomplicado (UFW) está habilitado e em execução.

  • Um Nome de Domínio Totalmente Qualificado (FQDN) como meilisearch.example.com apontando para seu servidor. Isso é benéfico se você quiser servir o Meilisearch via SSL usando um servidor proxy.

  • Tudo está atualizado. $ sudo apt update && sudo apt upgrade

  • Alguns pacotes essenciais são necessários para o tutorial. Alguns destes podem já estar instalados em seu servidor. $ sudo apt install curl wget nano software-properties-common dirmngr apt-transport-https ca-certificates lsb-release debian-archive-keyring gnupg2 ufw unzip -y

Passo 1 - Configurar o Firewall

O primeiro passo antes de instalar qualquer pacote é configurar o firewall para permitir conexões HTTP e HTTPS.

Verifique o status do firewall.

$ sudo ufw status

Você deve ver algo como o seguinte.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Permita as portas HTTP e HTTPS.

$ sudo ufw allow http
$ sudo ufw allow https

Verifique o status novamente para confirmar.

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443/tcp (v6)               ALLOW       Anywhere (v6)

Passo 2 - Instalar Meilisearch

Existem várias maneiras de instalar o Meilisearch. Usaremos o método mais simples, que envolve copiar o arquivo binário para nosso servidor.

Instale o Meilisearch.

$ curl -L https://install.meilisearch.com | sh

Torne o binário executável.

$ chmod +x meilisearch

Neste momento, o binário só é utilizável a partir do diretório onde você o baixou. Para poder usá-lo de qualquer lugar, mova o arquivo binário para o diretório /usr/local/bin.

$ sudo mv ./meilisearch /usr/local/bin/

Confirme que o Meilisearch está instalado e funcionando corretamente.

$ meilisearch --version
meilisearch 1.7.6

Passo 3 - Criar um usuário do sistema para o Meilisearch

Executar o Meilisearch como root pode criar problemas de segurança. Para evitá-los, crie um usuário do sistema para executar o Meilisearch.

$ sudo useradd -d /var/lib/meilisearch -b /bin/false -m -r meilisearch

Passo 4 - Configurar o Meilisearch

Antes de prosseguir, precisamos criar uma chave mestra que o Meilisearch usa para o processo de autenticação. Você pode usar o utilitário de linha de comando OpenSSL para criá-la. Execute o seguinte comando para criar uma chave mestra de 30 caracteres de comprimento. Você pode escolher qualquer comprimento para sua chave mestra. Quanto mais longa, melhor.

$ openssl rand -hex 30

Você deve receber uma saída semelhante com uma chave de 30 caracteres de comprimento. Copie este valor porque precisaremos dele nas etapas seguintes.

65ed5fc15848f7ceb8e646d4928fcf79f494cec239a2874cacd118e42611

Pegue o arquivo de configuração mais recente do repositório do GitHub do Meilisearch e copie-o para o diretório /etc.

$ sudo sh -c 'curl https://raw.githubusercontent.com/meilisearch/meilisearch/latest/config.toml > /etc/meilisearch.toml'

Abra-o para edição.

$ sudo nano /etc/meilisearch.toml

Atualize as seguintes linhas no arquivo para configurar o caminho do banco de dados, caminho do dump, diretório de snapshots e ambiente de trabalho, e adicione a chave mestra que você gerou anteriormente para autenticação.

Os valores atualizados no arquivo de configuração devem ficar assim.

env = "production"
master_key = "173e95f077590ed33dad89247247be8d8ce8b6722ccc87829aaefe3207be"
db_path = "/var/lib/meilisearch/data"
dump_dir = "/var/lib/meilisearch/dumps"
snapshot_dir = "/var/lib/meilisearch/snapshots"

O Meilisearch coleta dados regularmente de forma anônima. Você deve desativá-lo usando a seguinte opção. Descomente para desativar a telemetria do Meilisearch.

no_analytics = true

Por padrão, o Meilisearch usa no máximo dois terços da RAM disponível em seu sistema. Você pode controlar isso descomentando e definindo a seguinte variável. Você também pode especificar o valor como o número exato de bytes para ser preciso e exato.

max_indexing_memory = "1 GiB"

O Meilisearch usa no máximo metade dos núcleos de CPU disponíveis. Você pode, no entanto, controlar esse valor descomentando e definindo a seguinte variável.

max_indexing_threads = 1

Definir esse valor maior do que o número de núcleos de CPU da máquina dirá ao Meilisearch para usar o número máximo de núcleos disponíveis.

Mais uma configuração que você deve conhecer é a quantidade máxima de carga que o Meilisearch pode aceitar. O valor padrão é definido em 100MB. Você pode alterá-lo configurando a seguinte variável.

http_payload_size_limit = "100 MB"

Uma vez terminado, salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Passo 5 - Criar diretórios e dar permissões

Crie os diretórios onde o Meilisearch armazenará seu banco de dados, dumps de banco de dados e snapshots.

$ sudo mkdir /var/lib/meilisearch/dumps -p
$ sudo mkdir /var/lib/meilisearch/snapshots

Defina o proprietário e o grupo desses diretórios para o usuário do sistema que criamos para o Meilisearch.

$ sudo chown -R meilisearch:meilisearch /var/lib/meilisearch

Defina o proprietário e o grupo no arquivo binário do Meilisearch.

$ sudo chown meilisearch:meilisearch /usr/local/bin/meilisearch

Defina permissões adequadas no diretório.

$ sudo chmod 750 /var/lib/meilisearch

Passo 6 - Executar o Meilisearch como um serviço

Para tornar o Meilisearch disponível o tempo todo para solicitações de busca, é melhor executá-lo como um serviço do sistema. Para isso, precisamos criar um arquivo de serviço para ele.

Crie e abra /etc/systemd/system/meilisearch.service para edição.

$ sudo nano /etc/systemd/system/meilisearch.service

Cole o seguinte código nele.

[Unit]
Description=Meilisearch
After=systemd-user-sessions.service

[Service]
Type=simple
WorkingDirectory=/var/lib/meilisearch
ExecStart=/usr/local/bin/meilisearch --config-file-path /etc/meilisearch.toml
User=meilisearch
Group=meilisearch

[Install]
WantedBy=multi-user.target

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Habilite o serviço.

$ sudo systemctl enable meilisearch

Inicie o serviço Meilisearch.

$ sudo systemctl start meilisearch 

Verifique o status do serviço

$ sudo systemctl status meilisearch

Você deve receber uma saída semelhante.

? meilisearch.service - Meilisearch
     Loaded: loaded (/etc/systemd/system/meilisearch.service; enabled; preset: enabled)
     Active: active (running) since Fri 2024-05-03 03:02:53 UTC; 5s ago
   Main PID: 1008 (meilisearch)
      Tasks: 6 (limit: 2251)
     Memory: 23.0M
        CPU: 10ms
     CGroup: /system.slice/meilisearch.service
             ??1008 /usr/local/bin/meilisearch --config-file-path /etc/meilisearch.toml

May 03 03:02:53 meilisearch meilisearch[1008]: Commit date:                "unknown"
May 03 03:02:53 meilisearch meilisearch[1008]: Package version:        "1.7.6"
May 03 03:02:53 meilisearch meilisearch[1008]: Anonymous telemetry:        "Disabled"
May 03 03:02:53 meilisearch meilisearch[1008]: A master key has been set. Requests to Meilisearch won't be authorized unless you provide an authentication key.
May 03 03:02:53 meilisearch meilisearch[1008]: Check out Meilisearch Cloud!        https://www.meilisearch.com/cloud?utm_campaign=oss&utm_source=engine&utm_medium=cli
May 03 03:02:53 meilisearch meilisearch[1008]: Documentation:                        https://www.meilisearch.com/docs
May 03 03:02:53 meilisearch meilisearch[1008]: Source code:                        https://github.com/meilisearch/meilisearch
May 03 03:02:53 meilisearch meilisearch[1008]: Discord:                        https://discord.meilisearch.com
May 03 03:02:53 meilisearch meilisearch[1008]: 2024-05-03T03:02:53.891366Z  INFO actix_server::builder: starting 2 workers
May 03 03:02:53 meilisearch meilisearch[1008]: 2024-05-03T03:02:53.891396Z  INFO actix_server::server: Actix runtime found; starting in Actix runtime

O Meilisearch está instalado e em execução. Vamos expor o serviço para o exterior usando o servidor Nginx como um proxy reverso e usar o Let’s Encrypt para servi-lo via SSL.

Passo 7 - Instalar Nginx

O Debian 12 vem com uma versão mais antiga do Nginx. Você precisa baixar o repositório oficial do Nginx para instalar a versão mais recente.

Importe a chave de assinatura do Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Adicione o repositório para a versão principal do Nginx.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

Atualize os repositórios do sistema.

$ sudo apt update

Instale o Nginx.

$ sudo apt install nginx

Verifique a instalação. Em sistemas Debian, o seguinte comando só funcionará com sudo.

$ sudo nginx -v
nginx version: nginx/1.25.5

Inicie o servidor Nginx.

$ sudo systemctl start nginx

Verifique o status do serviço.

$ sudo systemctl status nginx
? nginx.service - nginx - servidor web de alto desempenho
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: active (running) since Fri 2024-05-03 03:04:02 UTC; 5s ago
       Docs: https://nginx.org/en/docs/
    Process: 1699 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 1700 (nginx)
      Tasks: 3 (limit: 2251)
     Memory: 2.9M
        CPU: 7ms
     CGroup: /system.slice/nginx.service
             ??1700 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??1701 "nginx: worker process"
             ??1702 "nginx: worker process"

May 03 03:04:02 meilisearch systemd[1]: Starting nginx.service - nginx - servidor web de alto desempenho...
May 03 03:04:02 meilisearch systemd[1]: Started nginx.service - nginx - servidor web de alto desempenho.

Passo 8 - Instalar SSL

Precisamos instalar o Certbot para gerar o certificado SSL. Você pode instalar o Certbot usando o repositório do Debian ou pegar a versão mais recente usando a ferramenta Snapd. Usaremos a versão Snapd.

O Debian 12 não vem com o Snapd instalado. Instale o pacote Snapd.

$ sudo apt install -y snapd

Execute os seguintes comandos para garantir que sua versão do Snapd esteja atualizada.

$ sudo snap install core && sudo snap refresh core

Instale o Certbot.

$ sudo snap install --classic certbot

Use o seguinte comando para garantir que o comando Certbot possa ser executado criando um link simbólico para o diretório /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Verifique se o Certbot está funcionando corretamente.

$ certbot --version
certbot 2.10.0

Execute o seguinte comando para gerar um Certificado SSL.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d meilisearch.example.com

O comando acima fará o download de um certificado para o diretório /etc/letsencrypt/live/meilisearch.example.com em seu servidor.

Gere um certificado de grupo Diffie-Hellman.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Verifique a lista de timers do systemd. O Certbot instala e inicia automaticamente um timer para fins de renovação.

$ sudo systemctl list-timers

Você encontrará snap.certbot.renew.service como um dos serviços programados para execução.

NEXT                        LEFT           LAST                        PASSED    UNIT                        ACTIVATES                   ---------------------------------------------------------------------------------------------------------------------------------------  
Fri 2024-05-03 17:17:15 UTC 14h left      Fri 2024-05-03 02:54:42 UTC 11min ago apt-daily.timer              apt-daily.service
Fri 2024-05-03 06:42:20 UTC 3h 36min left Fri 2024-05-03 02:54:42 UTC 11min ago apt-daily-upgrade.timer      apt-daily-upgrade.service
Fri 2024-05-03 10:39:00 UTC 7h left       -                           -         snap.certbot.renew.timer     snap.certbot.renew.service

Faça um teste do processo para verificar se a renovação do SSL está funcionando bem.

$ sudo certbot renew --dry-run

Se você não vir erros, está tudo pronto. Seu certificado será renovado automaticamente.

Passo 9 - Configurar Nginx

Abra o arquivo /etc/nginx/nginx.conf para edição.

$ sudo nano /etc/nginx/nginx.conf

Adicione a seguinte linha antes da linha include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size 64;

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Crie e abra o arquivo /etc/nginx/conf.d/meilisearch.conf para edição.

$ sudo nano /etc/nginx/conf.d/meilisearch.conf

Cole o seguinte código nele. Substitua meilisearch.example.com pelo seu nome de domínio.

server {

    listen 443 ssl;
    listen [::]:443 ssl;

    http2 on;
    http3 on;
    quic_retry on;

    server_name meilisearch.example.com;

    access_log  /var/log/nginx/meilisearch.access.log;
    error_log   /var/log/nginx/meilisearch.error.log;

    ssl_certificate      /etc/letsencrypt/live/meilisearch.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/meilisearch.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/meilisearch.example.com/chain.pem;

    ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    ssl_early_data on;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    location / {
        proxy_pass http://localhost:7700;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
# enforce HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name  meilisearch.example.com;
    return 301   https://$host$request_uri;
}

Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.

Verifique sua configuração do Nginx.

$ sudo nginx -t

Reinicie o servidor Nginx.

$ sudo systemctl restart nginx

O Meilisearch agora está em execução e disponível através da URL https://meilisearch.example.com. Você deve ver o seguinte texto ao abrir a URL.

{"status":"Meilisearch está em execução"}

Esta URL só pode ser usada para busca via linha de comando. Se você quiser acessar o Meilisearch através de uma interface, precisará integrá-lo com outro CMS ou software para fazê-lo funcionar, o que está fora do escopo deste tutorial. O Meilisearch vem com uma interface frontend embutida, mas isso funciona apenas se você estiver usando para fins de desenvolvimento. Você pode mudar o ambiente da instância para development no arquivo de configuração e reiniciar o Meilisearch para ativar a interface. Deve parecer algo como o seguinte.

Painel de Busca de Desenvolvimento do Meilisearch

Para um ambiente de produção, você precisará integrar o Meilisearch com outro CMS.

Vamos começar a usá-lo para indexar alguns documentos e usá-lo para busca.

Passo 10 - Carregando Dados de Exemplo no Meilisearch

O projeto Meilisearch fornece um arquivo de filme formatado em JSON com os dados extraídos do The Movie Database (TMDB). Baixe o arquivo.

$ wget https://www.meilisearch.com/movies.json

Você pode executar o comando tail para ver uma parte dos dados. Deve parecer com o seguinte.

$ tail -n 3 movies.json

{"id":460070,"title":"J.T. LeRoy","overview":"Uma jovem chamada Savannah Knoop passa seis anos fingindo ser um escritor transgênero chamado JT Leroy, a persona literária inventada de sua cunhada.","genres":["Drama"],"poster":"https://image.tmdb.org/t/p/w500/43ffZhMCWQhzMneGP4kDWoPV48X.jpg","release_date":1556236800},
{"id":460071,"title":"Lizzie","overview":"Massachusetts, 1892. Uma mulher solteira de 32 anos e uma excluída social, Lizzie vive uma vida claustrofóbica sob o controle frio e dominador de seu pai. Quando Bridget Sullivan, uma jovem empregada, vem trabalhar para a família, Lizzie encontra um espírito afim, simpático, e uma intimidade secreta logo se transforma em um plano maligno.","genres":["Crime","Drama","Thriller"],"poster":"https://image.tmdb.org/t/p/w500/z2iuBcwznen3kC9z4LeOzBSz1BB.jpg","release_date":1536883200}
]

Como você pode ver, cada entrada individual contém um id, um título, um link para a imagem do pôster, uma visão geral do filme, uma data de lançamento e uma lista de gêneros. A data de lançamento está no formato EPOCH.

Vamos carregar os dados no Meilisearch usando curl via uma solicitação HTTP POST.

$ curl \
  -X POST 'http://localhost:7700/indexes/movies/documents' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 65ed5fc15848f7ceb8e646d4928fcf79f494cec239a2874cacd118e42611' \
  --data-binary @movies.json

Vamos passar pelos argumentos do comando:

  • -X POST - especifica que estamos realizando uma solicitação HTTP POST e enviando dados.
  • -H Content-Type - especifica o tipo de conteúdo do arquivo.
  • -H Authorization: Bearer - é para passar a chave mestra com suas solicitações.
  • –data-binary - especifica o arquivo a ser incluído.

Aqui estamos criando um novo índice Meilisearch na localização /indexes/movies/documents. Você deve receber uma saída semelhante informando que a solicitação foi enfileirada. O Meilisearch processa todas as solicitações de forma assíncrona.

{"taskUid":0,"indexUid":"movies","status":"enqueued","type":"documentAdditionOrUpdate","enqueuedAt":"2024-05-03T03:12:55.599798591Z"}

Você também pode executar o comando acima substituindo a URL http://localhost:7700 por https://meilisearch.example.com e funcionará da mesma forma. Você pode fazer isso para todos os comandos neste tutorial, mas para simplificar, vamos nos manter na URL http://localhost:7700.

Execute o seguinte comando para verificar o status da solicitação.

$ curl -X GET 'http://localhost:7700/indexes/movies/tasks/0'

Você deve receber uma saída semelhante.

{"uid":0,"indexUid":"movies","status":"succeeded","type":"documentAddition","details":{"receivedDocuments":19547,"indexedDocuments":19546},"duration":"PT29.866920116S","enqueuedAt":"2024-05-03T03:13:18.233702815Z","startedAt":"2024-05-03T03:19:45.370142371Z","finishedAt":"2024-05-03T03:20:05.108395540Z"}

Isso nos diz que a tarefa foi concluída e o banco de dados de filmes agora está totalmente indexado e pronto para uso.

Passo 11 - Usando Chaves Limitadas para Busca

Há uma ferramenta que precisamos que ajuda com a formatação JSON legível na linha de comando. Ela se chama jq. Execute o seguinte comando para instalá-la.

$ sudo apt install -y jq

Embora tenhamos adicionado a chave mestra ao arquivo de configuração, você precisará passá-la novamente com cada solicitação. Antes de prosseguir, precisamos de uma chave mais restrita que habilite o modo somente leitura. O Meilisearch cria uma chave padrão somente leitura por padrão. Vamos pegá-la.

$ curl -X GET 'http://localhost:7700/keys' -H 'Authorization: Bearer 65ed5fc15848f7ceb8e646d4928fcf79f494cec239a2874cacd118e42611' | jq

Você deve ver uma saída semelhante.

{
  "results": [
    {
      "name": "Chave da API de Busca Padrão",
      "description": "Use-a para buscar a partir do frontend",
      "key": "591e51d2f6700ead7ba134a7aed0966d72e2022e43847caf48df3e4800c9279a",
      "uid": "d004073b-b813-4016-82cb-7995df5149f6",
      "actions": [
        "search"
      ],
      "indexes": [
        "*"
      ],
      "expiresAt": null,
      "createdAt": "2024-05-03T03:02:53.887256411Z",
      "updatedAt": "2024-05-03T03:02:53.887256411Z"
    },
    {
      "name": "Chave da API de Admin Padrão",
      "description": "Use-a para qualquer coisa que não seja uma operação de busca. Cuidado! Não a exponha em um frontend público",
      "key": "0f3cdcfe5d9a56273d6c708f068a82382a97b629b70f4962f969687b5e327196",
      "uid": "b4fc2f96-4347-4750-9ba6-2da73c26e2bd",
      "actions": [
        "*"
      ],
      "indexes": [
        "*"
      ],
      "expiresAt": null,
      "createdAt": "2024-05-03T03:02:53.886580786Z",
      "updatedAt": "2024-05-03T03:02:53.886580786Z"
    }
  ],
  "offset": 0,
  "limit": 20,
  "total": 2
}

A partir de agora, usaremos a Chave da API de Busca Padrão para realizar buscas.

Passo 12 - Buscando através de Dados de Exemplo

Existem duas maneiras de buscar usando o Meilisearch, você pode usar a API via linha de comando ou usar a interface web. A interface web é bastante limitada e funciona apenas se você usar o Meilisearch em um ambiente de desenvolvimento, e a API é a maneira recomendada de usar o Meilisearch. Como configuramos nossa busca para produção, usaremos apenas o método da linha de comando.

Buscar via API é como enviar dados através de uma solicitação HTTP POST. Você faz uma solicitação ao endpoint /search da API. Por exemplo, vamos buscar por qualquer filme com a palavra saint nele.

$ curl \
  -X POST 'http://localhost:7700/indexes/movies/search' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 591e51d2f6700ead7ba134a7aed0966d72e2022e43847caf48df3e4800c9279a' \
  --data-binary '{ "q": "saint" }' | jq

Você deve receber uma saída formatada em JSON como a seguinte.

{
  "hits": [
    {
      "id": 25248,
      "title": "Saint Ralph",
      "overview": "Esta comédia/drama canadense, ambientada em Hamilton, Ontário em 1954, é uma história doce e - às vezes - boba que se torna cada vez mais comovente à medida que os minutos passam. É a história fictícia de um aluno do nono ano, Ralph (Adam Butcher), que vive secretamente sozinho enquanto sua mãe viúva e hospitalizada permanece imersa em um coma. Frequentemente em apuros com o Padre Fitzpatrick (Gordon Pinsent), o diretor de sua escola católica só para meninos, Ralph é considerado uma piada entre os colegas até que ele decide realizar um milagre que poderia salvar sua mãe, ou seja, vencer a Maratona de Boston. Treinado por um padre mais jovem e ex-corredor, Padre Hibbert (Campbell Scott), cujo cinismo foi elevado pela pura esperança do garoto, Ralph se dedica à sua missão improvável, afastando os céticos e recebendo ajuda ao longo de um caminho muito desafiador de diversos aliados e amigos.",
      "genres": [
        "Comédia",
        "Drama"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/3MdWgqUunIBWnc7mYi2dtZrD54Y.jpg",
      "release_date": 1123200000
    },
    {
      "id": 26894,
      "title": "Saint Sinner",
      "overview": "Em 1815, um monge, Tomas Alcala, inadvertidamente libera duas succubus femininas, Munkar e Nakir, sobre um século 21 desavisado. Ele é escolhido por Deus para viajar através dos séculos e parar a fúria dos demônios.",
      "genres": [
        "Fantasia",
        "Horror",
        "Ficção Científica",
        "Filme para TV"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/cxljKsfUI6PVFPIgPvsesUWHai4.jpg",
      "release_date": 1035590400
    },
    {
      "id": 27023,
      "title": "Saint John of Las Vegas",
      "overview": "Um ex-jogador é atraído de volta ao jogo por um veterano investigador de fraudes de seguros.",
      "genres": [
        "Comédia"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/kN4Vur1SccouDR0k3tmJXJHdrXw.jpg",
      "release_date": 1264723200
    },
  ...

Para testar o recurso de correspondência difusa do Meilisearch, no qual palavras que soam semelhantes podem ser usadas para encontrar a busca exata. Isso é útil caso você cometa um erro de digitação e ainda espere o resultado correto.

$ curl \
  -X POST 'http://localhost:7700/indexes/movies/search' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 591e51d2f6700ead7ba134a7aed0966d72e2022e43847caf48df3e4800c9279a' \
  --data-binary '{ "q": "seint" }' | jq

Aqui, escrevemos saint como seint e o Meilisearch ainda retornará entradas com a palavra saint.

{
  "hits": [
    {
      "id": 10105,
      "title": "Saints and Soldiers",
      "overview": "Cinco soldados americanos lutando na Europa durante a Segunda Guerra Mundial lutam para retornar ao território aliado após serem separados das forças dos EUA durante o histórico Massacre de Malmedy.",
      "genres": [
        "Guerra",
        "Drama",
        "Ação",
        "Aventura",
        "História"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/efhqxap8fLi4v1GEXVvakey0z3S.jpg",
      "release_date": 1063238400
    },
    {
      "id": 25248,
      "title": "Saint Ralph",
      "overview": "Esta comédia/drama canadense, ambientada em Hamilton, Ontário em 1954, é uma história doce e - às vezes - boba que se torna cada vez mais comovente à medida que os minutos passam. É a história fictícia de um aluno do nono ano, Ralph (Adam Butcher), que vive secretamente sozinho enquanto sua mãe viúva e hospitalizada permanece imersa em um coma. Frequentemente em apuros com o Padre Fitzpatrick (Gordon Pinsent), o diretor de sua escola católica só para meninos, Ralph é considerado uma piada entre os colegas até que ele decide realizar um milagre que poderia salvar sua mãe, ou seja, vencer a Maratona de Boston. Treinado por um padre mais jovem e ex-corredor, Padre Hibbert (Campbell Scott), cujo cinismo foi elevado pela pura esperança do garoto, Ralph se dedica à sua missão improvável, afastando os céticos e recebendo ajuda ao longo de um caminho muito desafiador de diversos aliados e amigos.",
      "genres": [
        "Comédia",
        "Drama"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/3MdWgqUunIBWnc7mYi2dtZrD54Y.jpg",
      "release_date": 1123200000
    },
    {
      "id": 26894,
      "title": "Saint Sinner",
      "overview": "Em 1815, um monge, Tomas Alcala, inadvertidamente libera duas succubus femininas, Munkar e Nakir, sobre um século 21 desavisado. Ele é escolhido por Deus para viajar através dos séculos e parar a fúria dos demônios.",
      "genres": [
        "Fantasia",
        "Horror",
        "Ficção Científica",
        "Filme para TV"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/cxljKsfUI6PVFPIgPvsesUWHai4.jpg",
      "release_date": 1035590400
    },
 …

Passo 13 - Ajustando a Classificação de Busca e Filtrando Dados

Os mecanismos de busca podem retornar melhores resultados se souberem como classificar ou dar importância a certos resultados com base na importância de um determinado campo. O Meilisearch tem um conjunto padrão de regras de viés que você pode configurar para melhorar seus resultados de busca.

Mas primeiro, precisamos verificar as regras de classificação definidas pelo Meilisearch.

$ curl -X GET 'http://localhost:7700/indexes/movies/settings/ranking-rules' -H 'Authorization: Bearer 0f3cdcfe5d9a56273d6c708f068a82382a97b629b70f4962f969687b5e327196'

Você receberá a seguinte saída.

["words","typo","proximity","attribute","sort","exactness"]
  1. words - resultados são classificados pelo número decrescente de termos correspondentes.
  2. typo - resultados são classificados pelo aumento do número de erros de digitação. Menos consultas com erros de digitação são retornadas no topo.
  3. proximity - resultados são classificados pela distância crescente entre os termos correspondentes.
  4. attribute - resultados são classificados pela ordem de classificação do atributo.
  5. sort - resultados são classificados de acordo com parâmetros decididos no momento da consulta.
  6. exactness - resultados são classificados pela similaridade das palavras correspondentes com as palavras da consulta.

Você pode ler mais sobre relevância na documentação oficial do Meilisearch.

Emita o seguinte comando para alterar a ordem da regra de viés.

$ curl \
  -X POST 'http://localhost:7700/indexes/movies/settings/ranking-rules' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 0f3cdcfe5d9a56273d6c708f068a82382a97b629b70f4962f969687b5e327196' \
  --data-binary '[
      "words",
      "typo",
      "proximity",
      "release_date:asc",
      "attribute",
      "sort",
      "exactness",
      "rank:desc"
  ]'

Agora vamos filtrar os resultados da busca. Primeiro, vamos pedir ao Meilisearch para usar apenas certos atributos para realizar a busca e deixar de lado os atributos sem sentido, como id.

$ curl \
  -X POST 'http://localhost:7700/indexes/movies/settings' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 0f3cdcfe5d9a56273d6c708f068a82382a97b629b70f4962f969687b5e327196' \
  --data-binary '{
      "searchableAttributes": [
          "title",
          "overview",
          "genres"
      ]
  }'

Aqui, estamos realizando uma busca usando apenas os atributos title, overview e genres que darão melhores resultados.

Em seguida, podemos formatar nossos resultados de busca para exibir apenas certos atributos enquanto ocultamos os outros.

$ curl \
  -X POST 'http://localhost:7700/indexes/movies/settings/displayedAttributes' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 0f3cdcfe5d9a56273d6c708f068a82382a97b629b70f4962f969687b5e327196' \
  --data-binary '[
          "title",
          "overview",
          "genres",
          "release_date"
      ]'

Isso mostrará apenas os atributos que incluímos em nossa consulta com os resultados.

Por fim, você também pode fornecer uma lista de atributos para serem filtrados ou classificados. Isso inclui tanto filtragem quantitativa usando operadores matemáticos como < ou > quanto filtragem através da inclusão em um conjunto especificado. Isso também é chamado de busca facetada.

$ curl \
  -X PATCH 'http://localhost:7700/indexes/movies/settings' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 0f3cdcfe5d9a56273d6c708f068a82382a97b629b70f4962f969687b5e327196' \
  --data-binary '{
      "filterableAttributes": [
          "genres",
          "release_date"
      ],
      "sortableAttributes": [
          "release_date"
      ]
  }'

Podemos combinar todas essas regras para realizar uma consulta como a seguinte.

$ curl \
  -X POST 'http://localhost:7700/indexes/movies/search' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer 591e51d2f6700ead7ba134a7aed0966d72e2022e43847caf48df3e4800c9279a' \
  --data-binary '{ "q": "house", "sort": ["release_date:desc"], "filter": "genres = Horror" }' | jq

Aqui estamos procurando todos os filmes do gênero Horror do mais novo para o mais antigo contendo a palavra house no título. Você deve receber uma saída semelhante.

{
  "hits": [
    {
      "id": 440559,
      "title": "Housesitters",
      "overview": "Angie e Izzy conseguem um trabalho de casasitting que parece bom demais para ser verdade. Acontecem brincadeiras sobrenaturais grotescas.",
      "genres": [
        "Comédia",
        "Horror"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/9Gnu0PBdYzyd7ZkO74XK0xCH0iY.jpg",
      "release_date": 1524873600
    },
    {
      "id": 449550,
      "title": "Housewife",
      "overview": "Housewife gira em torno de Holly cuja mãe assassinou sua irmã e pai quando ela tinha sete anos. 20 anos depois e lentamente perdendo o controle sobre a diferença entre realidade e pesadelos, ela encontra um psíquico famoso que afirma que está destinado a ajudá-la.",
      "genres": [
        "Horror"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/ohHxS7PIRQb9O6KTrDtqYshYGts.jpg",
      "release_date": 1504828800
    },
    {
      "id": 392703,
      "title": "House of Darkness",
      "overview": "Inspirado em eventos reais, o thriller sobrenatural 'House of Darkness' relata o caso misterioso de uma família de São Francisco que alegou que uma força sombria foi responsável pelos trágicos eventos que se desenrolaram. Tentando salvar seu casamento em dificuldades, Kelly (Sara Fletcher, 'Adulthood'), seu marido Brian (Gunner Wright, 'J. Edgar') e sua filha Sarah (Mykayla Sohn, 'The Chosen') se mudam para uma casa rural em busca de serenidade. Sem saber, quase todas as famílias que viveram na casa sofreram algum tipo de tragédia, datando de quase 100 anos. Pouco depois de sua chegada, Kelly começa a perceber que o comportamento de seu marido está se tornando cada vez mais estranho e violento. Kelly também descobre que as vozes que está ouvindo ecoando pelos corredores não estão vindo de sua filha. Kelly e sua família serão as próximas vítimas das forças sombrias na casa?",
      "genres": [
        "Horror",
        "Thriller",
        "Filme para TV"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/ueQM9RsT0HLL2RuuiLmD07j8lKB.jpg",
      "release_date": 1460851200
    },
…

Passo 14 - Conclusão

Você terminou de instalar e configurar o Meilisearch em um ambiente de produção em um servidor Debian 12. Você também realizou algumas buscas básicas e aprendeu como melhorar os resultados de busca através de classificação e filtragem. Se você tiver alguma dúvida, poste nos comentários abaixo.

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.