wiki/HowtoMeilisearch.md

198 lines
8.1 KiB
Markdown

---
categories: databases bdd nosql
title: Howto Meilisearch
...
- Documentation : [https://www.meilisearch.com/docs](https://www.meilisearch.com/docs)
- Code : [https://github.com/meilisearch/meilisearch](https://github.com/meilisearch/meilisearch)
- Licence : [MIT License](https://github.com/meilisearch/meilisearch/blob/main/LICENSE)
- Langage : Rust
**Meilisearch** est un engin de recherche doté d'une API RESTful. Mis à disposition aux conditions de la licence MIT et écrit en Rust, il se démarque de ses concurrents (Elasticsearch, Algolia, etc. Voir le [tableau comparatif](https://www.meilisearch.com/docs/learn/what_is_meilisearch/comparison_to_alternatives)) par sa rapidité d'exécution et un focus sur l'expérience utilisateur. Les données de Meilisearch sont stockées dans [LMDB](https://www.meilisearch.com/docs/learn/advanced/storage#understanding-lmdb).
# Requis
Le code roule sur [différents systèmes d'exploitation](https://www.meilisearch.com/docs/learn/getting_started/installation#supported-operating-systems) dont les principales distributions de GNU/Linux utilisant `glibc 2.27` ou + sur l'architecture matérielle `amd64/x86_64`.
# Installation
Une [procédure](https://www.meilisearch.com/docs/learn/cookbooks/running_production) d'installation pour Debian est disponible dans la documentation officielle.
La première étape est d'ajouter le dépôt privé du développeur avant d'installer le paquet Debian :
~~~
# echo "deb [trusted=yes] https://apt.fury.io/meilisearch/ /" | tee /etc/apt/sources.list.d/fury.list
# apt update && apt install meilisearch
~~~
Ensuite on ajoute un nouvel utilisateur UNIX non privilégié qui sera chargé d'exécuter Meilisearch :
~~~
# useradd -d /home/meilisearch -b /bin/false -m -r meilisearch
~~~
Puis on récupère une copie du fichier de configuration principal qu'on ajuste ensuite au besoin :
~~~
# curl https://raw.githubusercontent.com/meilisearch/meilisearch/latest/config.toml > /etc/meilisearch.toml
# chown meilisearch: /etc/meilisearch.toml
# editor /etc/meilisearch.toml
~~~
Voici un exemple de contenu pertinent pour le fichier `/etc/meilisearch.toml` :
~~~
env = "production"
master_key = "YOUR_MASTER_KEY_VALUE"
db_path = "/home/meilisearch/data"
dump_dir = "/home/meilisearch/dumps"
snapshot_dir = "/home/meilisearch/snapshots"
~~~
Pour des raisons de sécurité évidentes, il faut mettre une vraie chaîne aléatoire (générée par exemple via la commande `apg -n1 -m64`) à la place de `YOUR_MASTER_KEY_VALUE`. Aussi, les répertoires cités ci-haut n'existent pas encore, alors il faut les ajouter :
~~~
# sudo -iu meilisearch
$ mkdir data dumps snapshots log
$ exit
~~~
Meilisearch peut être lancé via systemd. On commence par éditer un nouveau fichier de configuration nommé `/etc/systemd/system/meilisearch.service` dans lequel on insère quelque chose comme ceci :
~~~
[Unit]
Description=Meilisearch
After=systemd-user-sessions.service
[Service]
Type=simple
WorkingDirectory=/home/meilisearch
ExecStart=/usr/bin/meilisearch --config-file-path /etc/meilisearch.toml
User=meilisearch
Group=meilisearch
[Install]
WantedBy=multi-user.target
~~~
... et on lance la nouvelle unité systemd après l'avoir activée :
~~~
# systemctl enable --now meilisearch
# systemctl status meilisearch
~~~
Le service Meilisearch est maintenant prêt à fonctionner en local (`127.0.0.1:7700`). On voudra probablement le faire communiquer avec le monde extérieur via un serveur mandataire (*proxy*) comme Nginx, HAProxy ou Apache. La doc officielle [donne un exemple pour nginx](https://www.meilisearch.com/docs/learn/cookbooks/running_production#step-5-secure-and-finish-your-setup). En voici un autre pour Apache, qui aura besoin d'un fichier de configuration pour vhost (disons `/etc/apache2/sites-available/meilisearch.conf`) semblable à celui-ci :
~~~
<VirtualHost *:80 *:443>
# FQDN principal
ServerName meilisearch.evolix.net
# Repertoire principal
DocumentRoot /home/meilisearch/www/
# SSL
SSLEngine On
SSLCertificateFile /etc/letsencrypt/meilisearch/live/fullchain.pem
SSLCertificateKeyFile /etc/ssl/private/meilisearch.key
# Propriete du repertoire
<Directory /home/meilisearch/www/>
Require all denied
Include /etc/apache2/whitelist.conf
</Directory>
# user - group
AssignUserID meilisearch meilisearch
# LOG
CustomLog /var/log/apache2/access.log vhost_combined
CustomLog /home/meilisearch/log/access.log combined
ErrorLog /home/meilisearch/log/error.log
# REDIR HTTPS
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule ^ https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
ProxyPreserveHost On
ProxyPass / http://localhost:7700
ProxyPassReverse / http://localhost:7700
<Proxy *>
Require all denied
Include /etc/apache2/whitelist.conf
</Proxy>
</VirtualHost>
~~~
Le vhost donné en exemple ci-haut écoute sur les ports 80 et 443 (SSL), force la redirection sur `https://` et n'autorise l'accès qu'à une liste d'adresses IP de confiance. Aussi, la directive `AssignUserID` suppose l'installation de Apache 2 MPM ITK. L'activation du vhost se fait de la manière suivante :
~~~
# a2ensite meilisearch
# apache2ctl -t && { systemctl reload apache2.service; systemctl status apache2.service; }
~~~
Voir [HowtoApache](HowtoApache) au besoin pour plus d'informations.
# Mise à jour
~~~
# apt-get update
# apt-get upgrade meilisearch
# systemctl restart meilisearch
~~~
# Règles de classement
Meilisearch utilise l'algorithme de tri par paquets (*bucket sort*) pour classer les documents qui correspondent aux mots-clés des requêtes.
Il y a six règles de classement par défaut (dans cet ordre) :
* "words", = **nombre décroissant de termes de la requêtes qui correspondent** aux documents indexés. Retourne en premier les documents qui contiennent tous les termes.
* "typo", = **nombre croissant de typos**. Retourne en premier les documents qui contiennent les termes de la requête avec le moins de typos.
* "proximity", = **distance croissante entre les termes de la requêtes**. Retourne en premier les documents pour lesquels les termes de la requête sont près l'un de l'autre et dans le même ordre que la requête.
* "attribute", = les résultats sont triés suivant **l'ordre de classement des attributs** des documents indexés. Retourne en premier les documents qui contiennent les termes de la requête dans les attributs les plus importants (exemple : titre du document). Voir https://www.meilisearch.com/docs/learn/core_concepts/relevancy#attribute-ranking-order
* "sort", = les résultats sont triés suivant **les paramètres décidés au moment de la requête**. (pas activé par défaut)
* "exactness" = les résultats sont triés selon **la ressemblance des mots des documents avec les mots de la requête**. Retourne en premier les documents qui contiennent exactement les mêmes termes.
Voir des exemples du fonctionnement de diverses règles de classement : https://www.meilisearch.com/docs/learn/core_concepts/relevancy#examples
# Utilisation
Voir le [guide de démarrage rapide](https://www.meilisearch.com/docs/learn/getting_started/quick_start) pour apprendre comment ajouter des documents dans la base de données de Meilisearch, gérer l'indexation et effectuer des recherches.
* Lister les paramètres de réglage de l'instance
~~~
curl -s -X GET https://$DOMAIN/indexes/$INDEXE/settings -H "Authorization: Bearer $KEY" |jq '' -r
~~~
* Supprimer tout ce qui est liée à un filtre
~~~
curl -s https://$DOMAIN/indexes/$INDEXE/documents/delete \
-H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' \
--data-binary '{ "filter": "source = redmine" }' |jq '' -r
~~~
* Lister les attribues de filtrage
~~~
curl -s -X GET https://$DOMAIN/indexes/$INDEXE/settings/filterable-attributes \
-H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' |jq '' -r
~~~
* Appliquer des attribues de filtrage
~~~
curl -s -X PUT https://$DOMAIN/indexes/$INDEXE/settings/filterable-attributes \
-H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' \
--data-binary '["source", "categories"]' |jq '' -r
~~~