Recherche de site Web

Comment installer et configurer Meilisearch sur Debian 12


Sur cette page

  1. Conditions préalables
  2. Étape 1 - Configurer le pare-feu
  3. Étape 2 - Installer Meilisearch
  4. Étape 3 - Créer un utilisateur système pour Meilisearch
  5. Étape 4 - Configurer Meilisearch
  6. Étape 5 - Créez des répertoires et accordez des autorisations
  7. Étape 6 - Exécutez Meilisearch en tant que service
  8. Étape 7 - Installer Nginx
  9. Étape 8 - Installer SSL
  10. Étape 9 - Configurer Nginx
  11. Étape 10 - Chargement des exemples de données dans Meilisearch
  12. Étape 11 - Utiliser des clés limitées pour la recherche
  13. Étape 12 - Recherche dans des exemples de données
  14. Étape 13 - Optimisation du classement de recherche et filtrage des données
  15. Étape 14 - Conclusion

Meilisearch est un moteur de recherche open source écrit en langage Rust. Être écrit avec Rust nécessite moins de ressources pour s'exécuter et peut être exécuté à l'aide d'un seul binaire de ligne de commande. Le processus d'installation est plus simple que les moteurs de recherche alternatifs et nécessite moins d'étapes. Ses fonctionnalités incluent la correspondance floue et l’indexation sans schéma. Il est livré avec une interface Web à des fins de démonstration. Il peut être intégré à diverses applications Web via diverses bibliothèques disponibles dans plusieurs langages comme JavaScript, Python, PHP, Ruby, etc.

Dans ce tutoriel, vous apprendrez comment installer Meilisearch en production sur un serveur Debian 12 et l'utiliser pour effectuer plusieurs recherches simples.

Conditions préalables

    Un serveur exécutant Debian 12 avec un minimum de 2 Go de RAM.

    Un utilisateur non root avec les privilèges sudo.

    Le pare-feu simple (UFW) est activé et en cours d'exécution.

    Un nom de domaine complet (FQDN) tel que meilisearch.example.com pointant vers votre serveur. Ceci est avantageux si vous souhaitez servir Meilisearch via SSL à l'aide d'un serveur proxy.

    Tout est mis à jour.

    $ sudo apt update && sudo apt upgrade
    

    Quelques packages essentiels sont requis pour le didacticiel. Certains d'entre eux sont peut-être déjà installés sur votre serveur.

    $ sudo apt install curl wget nano software-properties-common dirmngr apt-transport-https ca-certificates lsb-release debian-archive-keyring gnupg2 ufw unzip -y
    

Étape 1 - Configurer le pare-feu

La première étape avant d'installer un package consiste à configurer le pare-feu pour autoriser les connexions HTTP et HTTPS.

Vérifiez l'état du pare-feu.

$ sudo ufw status

Vous devriez voir quelque chose comme ce qui suit.

Status: active

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

Autoriser les ports HTTP et HTTPs.

$ sudo ufw allow http
$ sudo ufw allow https

Vérifiez à nouveau l'état pour confirmer.

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

Étape 2 - Installer Meilisearch

Il existe plusieurs façons d’installer Meilisearch. Nous utiliserons la méthode la plus simple qui consiste à copier le fichier binaire sur notre serveur.

Installez Meilisearch.

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

Rendre le binaire exécutable.

$ chmod +x meilisearch

Pour le moment, le binaire n'est utilisable qu'à partir du répertoire dans lequel vous l'avez téléchargé. Pour pouvoir l'utiliser de n'importe où, déplacez le fichier binaire vers le répertoire /usr/local/bin.

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

Confirmez que Meilisearch est installé et fonctionne correctement.

$ meilisearch --version
meilisearch 1.7.6

Étape 3 - Créer un utilisateur système pour Meilisearch

Exécuter Meilisearch en tant que root peut créer des problèmes de sécurité. Pour les éviter, créez un utilisateur système pour exécuter Meilisearch.

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

Étape 4 - Configurer Meilisearch

Avant de continuer, nous devons créer une clé principale que Meilisearch utilise pour le processus d'authentification. Vous pouvez utiliser l'utilitaire de ligne de commande OpenSSL pour le créer. Exécutez la commande suivante pour créer une clé principale de 30 caractères. Vous pouvez choisir n’importe quelle longueur pour votre clé principale. Plus c'est long, mieux c'est.

$ openssl rand -hex 30

Vous devriez recevoir une sortie similaire avec une clé de 30 caractères. Copiez cette valeur car nous en aurons besoin dans les étapes à venir.

65ed5fc15848f7ceb8e646d4928fcf79f494cec239a2874cacd118e42611

Récupérez le dernier fichier de configuration du référentiel Meilisearch GitHub et copiez-le dans le répertoire /etc.

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

Ouvrez-le pour le modifier.

$ sudo nano /etc/meilisearch.toml

Mettez à jour les lignes suivantes dans le fichier pour configurer le chemin de la base de données, le chemin de vidage, le répertoire des instantanés et l'environnement de travail, et ajoutez la clé principale que vous avez générée auparavant pour l'authentification.

Les valeurs mises à jour dans le fichier de configuration devraient ressembler à ce qui suit.

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

Meilisearch collecte régulièrement des données de manière anonyme. Vous devez le désactiver en utilisant l'option suivante. Décommentez-le pour désactiver la télémétrie de Meilisearch.

no_analytics = true

Par défaut, Meilisearch n'utilise pas plus des deux tiers de la RAM disponible sur votre système. Vous pouvez contrôler cela en décommentant et en définissant la variable suivante. Vous pouvez également spécifier la valeur sous forme de nombre exact d'octets pour être précis et exact.

max_indexing_memory = "1 GiB"

Meilisearch n'utilise pas plus de la moitié des cœurs de processeur disponibles. Vous pouvez cependant contrôler cette valeur en supprimant les commentaires et en définissant la variable suivante.

max_indexing_threads = 1

Définir cette valeur supérieure au nombre de cœurs de processeur de la machine indiquera à Meilisearch d'utiliser le nombre maximum de cœurs disponibles.

Un autre paramètre que vous devez connaître est la quantité de charge utile maximale que Meilisearch peut prendre en charge. La valeur par défaut est définie sur 100 Mo. Vous pouvez le modifier en configurant la variable suivante.

http_payload_size_limit = "100 MB"

Une fois terminé, enregistrez le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque vous y êtes invité.

Étape 5 - Créez des répertoires et accordez des autorisations

Créez les répertoires dans lesquels Meilisearch stockera sa base de données, ses sauvegardes de base de données et ses instantanés.

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

Définissez le propriétaire et le groupe de ces répertoires sur l'utilisateur système que nous avons créé pour Meilisearch.

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

Définissez le propriétaire et le groupe sur le fichier binaire Meilisearch.

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

Définissez les autorisations appropriées sur le répertoire.

$ sudo chmod 750 /var/lib/meilisearch

Étape 6 - Exécutez Meilisearch en tant que service

Pour que Meilisearch soit disponible à tout moment pour les demandes de recherche, il est préférable de l'exécuter en tant que service système. Pour cela, nous devons créer un fichier de service correspondant.

Créez et ouvrez /etc/systemd/system/meilisearch.service pour le modifier.

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

Collez-y le code suivant.

[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

Enregistrez le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque vous y êtes invité.

Activez le service.

$ sudo systemctl enable meilisearch

Démarrez le service Meilisearch.

$ sudo systemctl start meilisearch 

Vérifier l'état du service

$ sudo systemctl status meilisearch

Vous devriez recevoir un résultat similaire.

? 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 installé et en cours d’exécution. Exposons le service à l'extérieur en utilisant le serveur Nginx comme proxy inverse et utilisons Let's Encrypt pour le servir via SSL.

Étape 7 - Installer Nginx

Debian 12 est livré avec une ancienne version de Nginx. Vous devez télécharger le référentiel officiel Nginx pour installer la dernière version.

Importez la clé de signature de Nginx.

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

Ajoutez le référentiel pour la version principale 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

Mettez à jour les référentiels système.

$ sudo apt update

Installez Nginx.

$ sudo apt install nginx

Vérifiez l'installation. Sur les systèmes Debian, la commande suivante ne fonctionnera qu'avec sudo.

$ sudo nginx -v
nginx version: nginx/1.25.5

Démarrez le serveur Nginx.

$ sudo systemctl start nginx

Vérifiez l'état du service.

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

Étape 8 - Installer SSL

Nous devons installer Certbot pour générer le certificat SSL. Vous pouvez soit installer Certbot à l'aide du référentiel Debian, soit récupérer la dernière version à l'aide de l'outil Snapd. Nous utiliserons la version Snapd.

Debian 12 n'est pas fourni avec Snapd installé. Installez le package Snapd.

$ sudo apt install -y snapd

Exécutez les commandes suivantes pour vous assurer que votre version de Snapd est à jour.

$ sudo snap install core && sudo snap refresh core

Installez Certbot.

$ sudo snap install --classic certbot

Utilisez la commande suivante pour vous assurer que la commande Certbot peut être exécutée en créant un lien symbolique vers le répertoire /usr/bin.

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

Vérifiez si Certbot fonctionne correctement.

$ certbot --version
certbot 2.10.0

Exécutez la commande suivante pour générer un certificat SSL.

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

La commande ci-dessus téléchargera un certificat dans le répertoire /etc/letsencrypt/live/meilisearch.example.com sur votre serveur.

Générez un certificat de groupe Diffie-Hellman.

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

Vérifiez la liste des minuteries système. Certbot installe et démarre automatiquement une minuterie à des fins de renouvellement.

$ sudo systemctl list-timers

Vous trouverez snap.certbot.renew.service comme l'un des services dont l'exécution est planifiée.

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

Effectuez un essai à sec du processus pour vérifier si le renouvellement SSL fonctionne correctement.

$ sudo certbot renew --dry-run

Si vous ne voyez aucune erreur, vous êtes prêt. Votre certificat se renouvellera automatiquement.

Étape 9 - Configurer Nginx

Ouvrez le fichier /etc/nginx/nginx.conf pour le modifier.

$ sudo nano /etc/nginx/nginx.conf

Ajoutez la ligne suivante avant la ligne include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size 64;

Enregistrez le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque vous y êtes invité.

Créez et ouvrez le fichier /etc/nginx/conf.d/meilisearch.conf pour le modifier.

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

Collez-y le code suivant. Remplacez meilisearch.example.com par votre nom de domaine.

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

Enregistrez le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque vous y êtes invité.

Vérifiez votre configuration Nginx.

$ sudo nginx -t

Redémarrez le serveur Nginx.

$ sudo systemctl restart nginx

Meilisearch est désormais opérationnel et disponible via l'URL https://meilisearch.example.com. Vous devriez voir le texte suivant lorsque vous ouvrez l'URL.

{"status":"Meilisearch is running"}

Cette URL ne peut être utilisée que pour effectuer une recherche via la ligne de commande. Si vous souhaitez accéder à Meilisearch via un frontend, vous devrez l'intégrer à un autre CMS ou logiciel pour le faire fonctionner dont le cadre sort du cadre de ce tutoriel. Meilisearch est livré avec une interface frontale intégrée, mais qui ne fonctionne que si vous l'utilisez à des fins de développement. Vous pouvez changer l'environnement de l'instance en development dans le fichier de configuration et redémarrer Meilisearch pour activer l'interface. Cela devrait ressembler à ceci.

Pour un environnement de production, vous devrez intégrer Meilisearch à un autre CMS.

Commençons par l'utiliser pour indexer certains documents et l'utiliser pour la recherche.

Étape 10 - Chargement des exemples de données dans Meilisearch

Le projet Meilisearch fournit un exemple de fichier vidéo au format JSON avec les données supprimées de The Movie Database (TMDB). Téléchargez le fichier.

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

Vous pouvez exécuter la commande tail pour voir une partie des données. Cela devrait ressembler à ce qui suit.

$ 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}
]

Comme vous pouvez le voir, chaque entrée individuelle contient un identifiant, un titre, un lien vers l'image de l'affiche, un aperçu du film, une date de sortie et une liste de genres. La date de sortie est au format EPOCH.

Chargeons les données dans Meilisearch en utilisant curl via une requête HTTP POST.

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

Passons en revue les arguments de la commande :

  • -X POST - spécifie que nous effectuons une requête HTTP POST et envoyons des données.
  • -H Content-Type - spécifie le type de contenu du fichier.
  • -H Autorisation : Porteur - consiste à transmettre la clé principale avec vos demandes.
  • --data-binary - spécifie le fichier à inclure.

Ici, nous créons un nouvel index Meilisearch à l'emplacement /indexes/movies/documents. Vous devriez recevoir une sortie similaire vous indiquant que la demande a été mise en file d'attente. Meilisearch traite toutes les demandes de manière asynchrone.

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

Vous pouvez également exécuter la commande ci-dessus en remplaçant l'URL http://localhost:7700 par https://meilisearch.example.com et cela fonctionnera de la même manière. Vous pouvez le faire pour toutes les commandes de ce didacticiel mais par souci de simplicité, nous nous en tiendrons à l'URL http://localhost:7700.

Exécutez la commande suivante pour vérifier l'état de la demande.

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

Vous devriez recevoir un résultat similaire.

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

Cela nous indique que la tâche est terminée et que la base de données de films est désormais entièrement indexée et prête à être utilisée.

Étape 11 - Utiliser des clés limitées pour la recherche

Nous avons besoin d’un outil qui facilite le formatage JSON de ligne de commande lisible. Il s'appelle jq. Exécutez la commande suivante pour l'installer.

$ sudo apt install -y jq

Même si nous avons ajouté la clé principale au fichier de configuration, vous devrez la transmettre à nouveau à chaque requête. Avant d'aller de l'avant, nous avons besoin d'une clé plus restreinte qui activera le mode lecture seule. Meiliserch crée par défaut une clé en lecture seule par défaut. Saisissons-le.

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

Vous devriez voir une sortie similaire.

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

Désormais, nous utiliserons la clé API de recherche par défaut pour effectuer des recherches.

Étape 12 - Recherche dans des exemples de données

Il existe deux manières de rechercher à l'aide de Meilisearch, vous pouvez soit utiliser l'API via la ligne de commande, soit utiliser l'interface Web. L'interface Web est assez limitée et ne fonctionne que si vous utilisez Meilisearch dans un environnement de développement, et l'API est la méthode recommandée pour utiliser Meilisearch. Puisque nous avons configuré notre recherche pour la production, nous utiliserons uniquement la méthode de ligne de commande.

La recherche via l'API revient à télécharger des données via une requête HTTP POST. Vous effectuez une requête au point de terminaison /search de l'API. Par exemple, recherchons tous les films contenant le mot saint.

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

Vous devriez recevoir une sortie formatée en JSON comme celle-ci.

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

Tester la fonction de correspondance floue de Meilisearch dans laquelle des mots à consonance similaire peuvent être utilisés pour trouver la recherche exacte. Ceci est utile si vous faites une faute de frappe et que vous attendez toujours le résultat correct.

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

Ici, nous avons mal orthographié saint comme seint et Meilisearch renverra toujours les entrées avec le mot 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
    },
 …

Étape 13 - Optimisation du classement de recherche et filtrage des données

Les moteurs de recherche peuvent renvoyer de meilleurs résultats s’ils savent classer ou accorder de l’importance à certains résultats en fonction de l’importance d’un domaine particulier. Meilisearch dispose d'un ensemble par défaut de règles de biais que vous pouvez configurer pour améliorer vos résultats de recherche.

Mais nous devons d’abord vérifier les règles de classement définies par Meilisearch.

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

Vous obtiendrez le résultat suivant.

["words","typo","proximity","attribute","sort","exactness"]
  1. mots - les résultats sont triés par nombre décroissant de termes correspondants.
  2. faute de frappe - les résultats sont triés en augmentant le nombre de fautes de frappe. Moins de requêtes de faute de frappe sont renvoyées en haut.
  3. proximité : les résultats sont triés en augmentant la distance entre les termes correspondants.
  4. attribut : les résultats sont triés par ordre de classement des attributs.
  5. trier - les résultats sont triés en fonction des paramètres décidés au moment de la requête.
  6. exactitude : les résultats sont triés en fonction de la similarité des mots correspondants avec les mots recherchés.

Vous pouvez en savoir plus sur la pertinence dans la documentation officielle de Meilisearch.

Exécutez la commande suivante pour modifier l’ordre des règles de biais.

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

Filtrons maintenant les résultats de la recherche. Tout d'abord, demandons à Meilisearch d'utiliser uniquement certains attributs pour effectuer la recherche et de laisser de côté les attributs dénués de sens comme 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"
      ]
  }'

Ici, nous effectuons une recherche uniquement en utilisant les attributs title, overview et genres qui donneront de meilleurs résultats.

Ensuite, nous pouvons formater nos résultats de recherche pour afficher uniquement certains attributs tout en masquant les autres.

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

Cela affichera uniquement les attributs que nous avons inclus dans notre requête avec les résultats.

Enfin, vous pouvez également fournir une liste d'attributs à filtrer ou trier. Cela inclut à la fois le filtrage quantitatif utilisant des opérateurs mathématiques tels que < ou > et le filtrage par inclusion dans un ensemble spécifié. C'est ce qu'on appelle également une recherche à facettes.

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

Nous pouvons combiner toutes ces règles pour effectuer une requête comme la suivante.

$ 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

Nous recherchons ici tous les films du genre Horreur du plus récent au plus ancien contenant le mot house dans le titre. Vous devriez recevoir un résultat similaire.

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

Étape 14 - Conclusion

Vous avez terminé l'installation et la configuration de Meilisearch dans un environnement de production sur un serveur Debian 12. Vous avez également effectué quelques recherches de base et appris à améliorer les résultats de recherche grâce au classement et au filtrage. Si vous avez des questions, postez-les dans les commentaires ci-dessous.

Articles connexes: