Cómo instalar y configurar Meilisearch en Debian 12

Meilisearch es un motor de búsqueda de código abierto escrito en lenguaje Rust. Al estar escrito utilizando Rust, requiere menos recursos para ejecutarse y puede ejecutarse utilizando un único binario de línea de comandos. El proceso de instalación es más sencillo que el de los motores de búsqueda alternativos y requiere menos pasos. Entre sus características se incluyen la concordancia difusa y la indexación sin esquema. Incluye una interfaz web de demostración. Se puede integrar en varias aplicaciones web a través de diversas bibliotecas disponibles en múltiples lenguajes como JavaScript, Python, PHP, Ruby, etc.

En este tutorial, aprenderás a instalar Meilisearch en producción en un servidor Debian 12 y a utilizarlo para realizar varias búsquedas sencillas.

Requisitos previos

  • Un servidor que ejecute Debian 12 con un mínimo de 2 GB de RAM.
  • Un usuario no root con privilegios sudo.
  • El cortafuegos sin complicaciones (UFW) está activado y en ejecución.
  • Un Nombre de Dominio Completamente Cualificado (FQDN) como meilisearch.example.com apuntando a tu servidor. Esto es beneficioso si quieres servir Meilisearch a través de SSL utilizando un servidor proxy.
  • Todo está actualizado.
    $ sudo apt update && sudo apt upgrade
    
  • Se necesitan algunos paquetes esenciales para el tutorial. Es posible que algunos de ellos ya estén instalados en tu 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
    

Paso 1 – Configurar el cortafuegos

El primer paso antes de instalar ningún paquete es configurar el cortafuegos para que permita conexiones HTTP y HTTPS.

Comprueba el estado del cortafuegos.

$ sudo ufw status

Deberías ver algo como lo siguiente

Status: active

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

Permitir puertos HTTP y HTTPs.

$ sudo ufw allow http
$ sudo ufw allow https

Vuelve a comprobar el estado para confirmarlo.

$ 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)

Paso 2 – Instalar Meilisearch

Hay varias formas de instalar Meilisearch. Nosotros utilizaremos el método más sencillo, que consiste en copiar el archivo binario a nuestro servidor.

Instala Meilisearch.

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

Haz que el binario sea ejecutable.

$ chmod +x meilisearch

Ahora mismo el binario sólo se puede utilizar desde el directorio donde lo descargaste. Para poder utilizarlo desde cualquier lugar, mueve el archivo binario al directorio /usr/local/bin.

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

Confirma que Meilisearch está instalado y funcionando correctamente.

$ meilisearch --version
meilisearch 1.7.6

Paso 3 – Crear un usuario de sistema para el Meilisearch

Ejecutar Meilisearch como root puede crear problemas de seguridad. Para evitarlos, crea un usuario de sistema para ejecutar el Meilisearch.

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

Paso 4 – Configura el Meilisearch

Antes de seguir adelante, necesitamos crear una clave maestra que Meilisearch utilice para el proceso de autenticación. Puedes utilizar la utilidad de línea de comandos OpenSSL para crearla. Ejecuta el siguiente comando para crear una clave maestra de 30 caracteres de longitud. Puedes elegir cualquier longitud para tu clave maestra. Cuanto más larga, mejor.

$ openssl rand -hex 30

Deberías recibir un resultado similar con una clave de 30 caracteres. Copia este valor porque lo necesitaremos en los próximos pasos.

65ed5fc15848f7ceb8e646d4928fcf79f494cec239a2874cacd118e42611

Coge el último archivo de configuración del repositorio GitHub de Meilisearch y cópialo en el directorio /etc.

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

Ábrelo para editarlo.

$ sudo nano /etc/meilisearch.toml

Actualiza las siguientes líneas del archivo para configurar la ruta de la base de datos, la ruta de volcado, el directorio de instantáneas y, el entorno de trabajo, y añade la clave maestra que generaste antes para la autenticación.

Los valores actualizados en el archivo de configuración deben tener el siguiente aspecto.

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

Meilisearch recopila los datos habituales de forma anónima. Deberías desactivarlo utilizando la siguiente opción. Descoméntala para desactivar la telemetría de Meilisearch.

no_analytics = true

Por defecto, Meilisearch no utiliza más de dos tercios de la RAM disponible en tu sistema. Puedes controlar esto descomentando y estableciendo la siguiente variable. También puedes especificar el valor como el número exacto de bytes para ser preciso y exacto.

max_indexing_memory = "1 GiB"

Meilisearch no utiliza más de la mitad de los núcleos de CPU disponibles. Sin embargo, puedes controlar este valor descomentando y estableciendo la siguiente variable.

max_indexing_threads = 1

Si estableces este valor por encima del número de núcleos de CPU de la máquina, le dirás a Meilisearch que utilice el número máximo de núcleos disponibles.

Otro ajuste que debes conocer es la cantidad de carga útil máxima que puede aceptar Meilisearch. El valor por defecto es de 100MB. Puedes cambiarlo configurando la siguiente variable.

http_payload_size_limit = "100 MB"

Una vez hayas terminado, guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Paso 5 – Crear directorios y dar permisos

Crea los directorios donde Meilisearch almacenará su base de datos, los volcados de la base de datos y las instantáneas.

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

Asigna el propietario y el grupo de estos directorios al usuario del sistema que hemos creado para Meilisearch.

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

Establece el propietario y el grupo del archivo binario del Meilisearch.

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

Establece los permisos adecuados en el directorio.

$ sudo chmod 750 /var/lib/meilisearch

Paso 6 – Ejecuta el Meilisearch como servicio

Para que Meilisearch esté disponible en todo momento para las peticiones de búsqueda, es mejor ejecutarlo como un servicio del sistema. Para ello, necesitamos crearle un archivo de servicio.

Crea y abre /etc/systemd/system/meilisearch.service para editarlo.

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

Pega en él el siguiente código.

[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

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Habilita el servicio.

$ sudo systemctl enable meilisearch

Inicia el servicio Meilisearch.

$ sudo systemctl start meilisearch 

Comprueba el estado del servicio

$ sudo systemctl status meilisearch

Deberías recibir una salida similar.

? 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

Meilisearch está instalado y funcionando. Expongamos el servicio al exterior utilizando el servidor Nginx como proxy inverso y utilicemos Let’s Encrypt para servirlo sobre SSL.

Paso 7 – Instalar Nginx

Debian 12 incluye una versión antigua de Nginx. Necesitas descargar el repositorio oficial de Nginx para instalar la última versión.

Importa la clave de firma de Nginx.

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

Añade el repositorio de la versión principal de 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

Actualiza los repositorios del sistema.

$ sudo apt update

Instala Nginx.

$ sudo apt install nginx

Verifica la instalación. En los sistemas Debian, el siguiente comando sólo funcionará con sudo.

$ sudo nginx -v
nginx version: nginx/1.25.5

Inicia el servidor Nginx.

$ sudo systemctl start nginx

Comprueba el estado del servicio.

$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
     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 - high performance web server...
May 03 03:04:02 meilisearch systemd[1]: Started nginx.service - nginx - high performance web server.

Paso 8 – Instalar SSL

Necesitamos instalar Certbot para generar el certificado SSL. Puedes instalar Certbot utilizando el repositorio de Debian u obtener la última versión utilizando la herramienta Snapd. Nosotros utilizaremos la versión Snapd.

Debian 12 no viene con Snapd instalado. Instala el paquete Snapd.

$ sudo apt install -y snapd

Ejecuta los siguientes comandos para asegurarte de que tu versión de Snapd está actualizada.

$ sudo snap install core && sudo snap refresh core

Instala Certbot.

$ sudo snap install --classic certbot

Utiliza el siguiente comando para asegurarte de que se puede ejecutar el comando Certbot creando un enlace simbólico al directorio /usr/bin.

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

Comprueba si Certbot funciona correctamente.

$ certbot --version
certbot 2.10.0

Ejecuta el siguiente comando para generar un certificado SSL.

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

El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/meilisearch.example.com de tu servidor.

Genera un certificado de grupo Diffie-Hellman.

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

Comprueba la lista de temporizadores systemd. Certbot instala e inicia automáticamente un temporizador con fines de renovación.

$ sudo systemctl list-timers

Encontrarás snap.certbot.renew.service como uno de los servicios programados para ejecutarse.

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

Realiza una ejecución en seco del proceso para comprobar si la renovación SSL funciona correctamente.

$ sudo certbot renew --dry-run

Si no ves ningún error, ya está todo listo. Tu certificado se renovará automáticamente.

Paso 9 – Configurar Nginx

Abre el archivo /etc/nginx/nginx.conf para editarlo.

$ sudo nano /etc/nginx/nginx.conf

Añade la siguiente línea antes de la línea include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size 64;

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Crea y abre el archivo /etc/nginx/conf.d/meilisearch.conf para editarlo.

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

Pega en él el siguiente código. Sustituye meilisearch.example.com por el nombre de tu dominio.

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;
}

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Comprueba la configuración de Nginx.

$ sudo nginx -t

Reinicia el servidor Nginx.

$ sudo systemctl restart nginx

Meilisearch ya está en marcha y disponible a través de la URL https://meilisearch.example.com. Deberías ver el siguiente texto cuando abras la URL.

{"status":"Meilisearch is running"}

Esta URL sólo puede utilizarse para realizar búsquedas a través de la línea de comandos. Si quieres acceder a Meilisearch a través de un frontend, tendrás que integrarlo con otro CMS o software para que funcione, cuyo alcance queda fuera de este tutorial. Meilisearch se suministra con una interfaz frontend integrada, pero sólo funciona si lo utilizas con fines de desarrollo. Puedes cambiar el entorno de la instancia a development en el archivo de configuración y reiniciar Meilisearch para activar la interfaz. Debería tener un aspecto similar al siguiente.

Tablero de búsqueda de desarrollo de Meilisearch

Para un entorno de producción, necesitarás integrar Meilisearch con otro CMS.

Empecemos a utilizarlo para indexar algunos documentos y utilizarlo para realizar búsquedas.

Paso 10 – Cargar datos de muestra en Meilisearch

El proyecto Meilisearch proporciona un archivo de ejemplo en formato JSON con los datos desechados de The Movie Database (TMDB). Descarga el archivo.

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

Puedes ejecutar el comando tail para ver una parte de los datos. Debería tener el siguiente aspecto.

$ tail -n 3 movies.json

{"id":460070,"title":"J.T. LeRoy","overview":"A young woman named Savannah Knoop spends six years pretending to be a transgender writer named JT Leroy, the made-up literary persona of her sister-in-law.","genres":["Drama"],"poster":"https://image.tmdb.org/t/p/w500/43ffZhMCWQhzMneGP4kDWoPV48X.jpg","release_date":1556236800},
{"id":460071,"title":"Lizzie","overview":"Massachusetts, 1892. An unmarried woman of 32 and a social outcast, Lizzie lives a claustrophobic life under her father's cold and domineering control. When Bridget Sullivan, a young maid, comes to work for the family, Lizzie finds a sympathetic, kindred spirit, and a secret intimacy soon blossoms into a wicked plan.","genres":["Crime","Drama","Thriller"],"poster":"https://image.tmdb.org/t/p/w500/z2iuBcwznen3kC9z4LeOzBSz1BB.jpg","release_date":1536883200}
]

Como puedes ver, cada entrada individual contiene un id, un título, un enlace a la imagen del cartel, una descripción general de la película, una fecha de estreno y una lista de géneros. La fecha de estreno está en formato EPOCH.

Carguemos los datos en Meilisearch utilizando curl mediante una petición HTTP POST.

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

Repasemos los argumentos del comando

  • -X POST – especifica que estamos realizando una petición HTTP POST y enviando datos.
  • -H Content-Type – especifica el tipo de contenido del archivo.
  • -H Autorización: Bearer – es para pasar la clave maestra con tus peticiones.
  • –data-binary – especifica el archivo a incluir.

Aquí estamos creando un nuevo índice Meilisearch en la ubicación /indexes/movies/documents. Deberías recibir un mensaje similar indicándote que la solicitud se ha puesto en cola. Meilisearch procesa todas las peticiones de forma asíncrona.

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

También puedes ejecutar el comando anterior sustituyendo la URL http://localhost:7700 por https://meilisearch.example.com y funcionará de la misma manera. Puedes hacerlo para todos los comandos de este tutorial, pero para simplificar, nos ceñiremos a la URL http://localhost:7700.

Ejecuta el siguiente comando para comprobar el estado de la solicitud.

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

Deberías recibir una salida similar.

{"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"}

Esto nos indica que la tarea se ha completado y que la base de datos de películas está ahora totalmente indexada y lista para su uso.

Paso 11 – Utilizar claves limitadas para la búsqueda

Hay una herramienta que necesitamos y que nos ayuda con el formato JSON legible en la línea de comandos. Se llama jq. Ejecuta el siguiente comando para instalarla.

$ sudo apt install -y jq

Aunque hayamos añadido la clave maestra al archivo de configuración, tendrás que volver a pasarla con cada solicitud. Antes de seguir adelante, necesitamos una clave más restringida que habilite el modo de sólo lectura. Meiliserch crea por defecto una clave de sólo lectura. Vamos a cogerla.

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

Deberías ver una salida similar.

{
  "results": [
    {
      "name": "Default Search API Key",
      "description": "Use it to search from the 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": "Default Admin API Key",
      "description": "Use it for anything that is not a search operation. Caution! Do not expose it on a public frontend",
      "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 ahora, utilizaremos la clave API de Búsqueda por defecto para realizar búsquedas.

Paso 12 – Buscar en Datos de Muestra

Hay dos formas de buscar con Meilisearch, puedes utilizar la API a través de la línea de comandos o utilizar la interfaz web. La interfaz web es bastante limitada y sólo funciona si utilizas Meilisearch en un entorno de desarrollo, y la API es la forma recomendada de utilizar Meilisearch. Como hemos configurado nuestra búsqueda para producción, sólo utilizaremos el método de la línea de comandos.

Buscar a través de la API es como subir datos mediante una solicitud HTTP POST. Realizas una solicitud al punto final /search de la API. Por ejemplo, busquemos cualquier película que contenga la palabra saint.

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

Deberías recibir una salida formateada en JSON como la siguiente.

{
  "hits": [
    {
      "id": 25248,
      "title": "Saint Ralph",
      "overview": "This Canadian made comedy/drama, set in Hamilton, Ontario in 1954, is a sweet and - at times - goofy story that becomes increasingly poignant as the minutes tick by.  It's the fictional tale of a wayward 9th grader, Ralph (Adam Butcher), who is secretly living on his own while his widowed, hospitalized mother remains immersed in a coma. Frequently in trouble with Father Fitzpatrick (Gordon Pinsent), the principal of his all-boys, Catholic school, Ralph is considered something of a joke among peers until he decides to pull off a miracle that could save his mother, i.e., winning the Boston Marathon.  Coached by a younger priest and former runner, Father Hibbert (Campbell Scott), whose cynicism has been lifted by the boy's pure hope, Ralph applies himself to his unlikely mission, fending off naysayers and getting help along a very challenging path from sundry allies and friends.",
      "genres": [
        "Comedy",
        "Drama"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/3MdWgqUunIBWnc7mYi2dtZrD54Y.jpg",
      "release_date": 1123200000
    },
    {
      "id": 26894,
      "title": "Saint Sinner",
      "overview": "In 1815 a monk, Tomas Alcala, unwittingly unleashes two female succubi, Munkar and Nakir, upon an unsuspecting 21st century. He is chosen by God to travel through the centuries and stop the demons' rampage.",
      "genres": [
        "Fantasy",
        "Horror",
        "Science Fiction",
        "TV Movie"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/cxljKsfUI6PVFPIgPvsesUWHai4.jpg",
      "release_date": 1035590400
    },
    {
      "id": 27023,
      "title": "Saint John of Las Vegas",
      "overview": "An ex-gambler is lured back into the game by a veteran insurance-fraud investigator.",
      "genres": [
        "Comedy"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/kN4Vur1SccouDR0k3tmJXJHdrXw.jpg",
      "release_date": 1264723200
    },
  ...

Para probar la función de coincidencia difusa de Meilisearch, en la que se pueden utilizar palabras que suenen parecido para encontrar la búsqueda exacta. Esto es útil en caso de que cometas un error tipográfico y sigas esperando el resultado correcto.

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

Aquí, hemos escrito mal saint como seint y Meilisearch seguirá devolviendo entradas con la palabra saint.

{
  "hits": [
    {
      "id": 10105,
      "title": "Saints and Soldiers",
      "overview": "Five American soldiers fighting in Europe during World War II struggle to return to Allied territory after being separated from U.S. forces during the historic Malmedy Massacre.",
      "genres": [
        "War",
        "Drama",
        "Action",
        "Adventure",
        "History"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/efhqxap8fLi4v1GEXVvakey0z3S.jpg",
      "release_date": 1063238400
    },
    {
      "id": 25248,
      "title": "Saint Ralph",
      "overview": "This Canadian made comedy/drama, set in Hamilton, Ontario in 1954, is a sweet and - at times - goofy story that becomes increasingly poignant as the minutes tick by.  It's the fictional tale of a wayward 9th grader, Ralph (Adam Butcher), who is secretly living on his own while his widowed, hospitalized mother remains immersed in a coma. Frequently in trouble with Father Fitzpatrick (Gordon Pinsent), the principal of his all-boys, Catholic school, Ralph is considered something of a joke among peers until he decides to pull off a miracle that could save his mother, i.e., winning the Boston Marathon.  Coached by a younger priest and former runner, Father Hibbert (Campbell Scott), whose cynicism has been lifted by the boy's pure hope, Ralph applies himself to his unlikely mission, fending off naysayers and getting help along a very challenging path from sundry allies and friends.",
      "genres": [
        "Comedy",
        "Drama"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/3MdWgqUunIBWnc7mYi2dtZrD54Y.jpg",
      "release_date": 1123200000
    },
    {
      "id": 26894,
      "title": "Saint Sinner",
      "overview": "In 1815 a monk, Tomas Alcala, unwittingly unleashes two female succubi, Munkar and Nakir, upon an unsuspecting 21st century. He is chosen by God to travel through the centuries and stop the demons' rampage.",
      "genres": [
        "Fantasy",
        "Horror",
        "Science Fiction",
        "TV Movie"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/cxljKsfUI6PVFPIgPvsesUWHai4.jpg",
      "release_date": 1035590400
    },
 …

Paso 13 – Ajustar la clasificación de la búsqueda y filtrar los datos

Los motores de búsqueda pueden devolver mejores resultados si saben cómo clasificar o dar importancia a determinados resultados en función de la importancia de un campo concreto. Meilisearch tiene un conjunto predeterminado de reglas de sesgo que puedes configurar para mejorar los resultados de la búsqueda.

Pero primero, tenemos que comprobar las reglas de clasificación establecidas por Meilisearch.

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

Obtendrás el siguiente resultado

["words","typo","proximity","attribute","sort","exactness"]
  1. palabras – los resultados se ordenan por número decreciente de términos coincidentes.
  2. erratas – los resultados se ordenan aumentando el número de erratas. Las consultas con menos erratas aparecen en primer lugar.
  3. proximidad – los resultados se ordenan aumentando la distancia entre los términos coincidentes.
  4. atributo – los resultados se ordenan por orden de clasificación de atributos.
  5. ordenación – los resultados se ordenan según los parámetros decididos en el momento de la consulta.
  6. exactitud – los resultados se ordenan por la similitud de las palabras coincidentes con las palabras de la consulta.

Puedes leer más sobre la relevancia en la documentación oficial de Meilisearch.

Ejecuta el siguiente comando para cambiar el orden de las reglas de parcialidad.

$ 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"
  ]'

Ahora vamos a filtrar los resultados de la búsqueda. En primer lugar, pidamos a Meilisearch que utilice sólo determinados atributos para realizar la búsqueda y deje de lado los atributos sin 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"
      ]
  }'

Aquí, estamos realizando una búsqueda utilizando sólo los atributos title, overview y genres que darán mejores resultados.

A continuación, podemos dar formato a los resultados de nuestra búsqueda para que sólo se muestren determinados atributos y se oculten los demás.

$ 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"
      ]'

Esto sólo mostrará con los resultados los atributos que hayamos incluido en nuestra consulta.

Por último, también puedes proporcionar una lista de atributos para filtrarlos u ordenarlos. Esto incluye tanto el filtrado cuantitativo mediante operadores matemáticos como < o > como el filtrado mediante la inclusión en un conjunto especificado. Esto también se denomina búsqueda 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 estas reglas para realizar una consulta como la siguiente.

$ 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

Aquí buscamos todas las películas del género Terror, de la más reciente a la más antigua, que contengan la palabra house en el título. Deberías obtener un resultado similar.

{
  "hits": [
    {
      "id": 440559,
      "title": "Housesitters",
      "overview": "Angie and Izzy get a housesitting gig that seems too good to be true. Gruesome supernatural hijinks ensue.",
      "genres": [
        "Comedy",
        "Horror"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/9Gnu0PBdYzyd7ZkO74XK0xCH0iY.jpg",
      "release_date": 1524873600
    },
    {
      "id": 449550,
      "title": "Housewife",
      "overview": "Housewife is centered on Holly whose mother murdered her sister and father when she was seven. 20 years later and slowly losing her grip on the difference between reality and nightmares, she runs into a celebrity psychic who claims that he is destined to help her.",
      "genres": [
        "Horror"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/ohHxS7PIRQb9O6KTrDtqYshYGts.jpg",
      "release_date": 1504828800
    },
    {
      "id": 392703,
      "title": "House of Darkness",
      "overview": "Inspired by true events, the supernatural thriller \"House of Darkness\" recounts the mysterious case of a San Francisco family who claimed that a dark force was responsible for the tragic events that unfolded.  Trying to save their struggling marriage Kelly (Sara Fletcher, \"Adulthood\"), her husband Brian (Gunner Wright, \"J. Edgar\") and their daughter Sarah (Mykayla Sohn, \"The Chosen\") move to a rural farmhouse in search of some serenity. Unbeknownst to them, nearly every family that has lived in the house has suffered some form of tragedy, dating back nearly 100 years. Shortly after their arrival, Kelly begins to sense that her husband’s behavior is growing increasingly strange and violent. Kelly also comes to discover the voices she’s hearing echoing through the halls, are not coming from her daughter. Will Kelly and her family be the next victims of the dark forces in the house?",
      "genres": [
        "Horror",
        "Thriller",
        "TV Movie"
      ],
      "poster": "https://image.tmdb.org/t/p/w500/ueQM9RsT0HLL2RuuiLmD07j8lKB.jpg",
      "release_date": 1460851200
    },
…

Paso 14 – Conclusión

Has terminado de instalar y configurar Meilisearch en un entorno de producción en un servidor Debian 12. También has realizado algunas búsquedas básicas y has aprendido a mejorar los resultados de búsqueda mediante la clasificación y el filtrado. Si tienes alguna pregunta, publícala en los comentarios a continuación.

También te podría gustar...