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.
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"]
- palabras – los resultados se ordenan por número decreciente de términos coincidentes.
- erratas – los resultados se ordenan aumentando el número de erratas. Las consultas con menos erratas aparecen en primer lugar.
- proximidad – los resultados se ordenan aumentando la distancia entre los términos coincidentes.
- atributo – los resultados se ordenan por orden de clasificación de atributos.
- ordenación – los resultados se ordenan según los parámetros decididos en el momento de la consulta.
- 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.