Découverte de Meilisearch

Voir la vidéo

Dans cette vidéo je vous propose de découvrir Meilisearch, un outil qui va vous permettre de mettre en place un système de recherche rapide et efficace pour votre site / application.

Écrit en Rust, cet outil se présente sous forme d'un simple éxécutable (fonctionnant sur Windows, Mac et Linux) qui va démarrer une base de données avec laquelle il sera possible de communiquer au travers d'une API HTTP. Cette API pourra d'ailleurs être sécurisée gràce à un système de clefs et de permissions.

Fonctionnalités

Par défaut, Meilisearch offre la plupart des fonctionnalité dont on peut avoir besoin pour mettre en place un système de recherche sur un site.

Ces fonctionnalités font de Meilisearch une bonne solution pour mettre en place une base de données secondaire qui sert de base à la mise en place des fonctionnalités de recherche.

Limitations

Comme beaucoup d'outils, certains compromis on été faits dans la conception de Meilisearch afin d'offir les fonctionnalités voulues. Ces compromis entraine des limitations qu'il faut connaitre pour éviter les mauvaise surprise. Pour résumer

  • Les recherches ne peuvent pas contenir plus de 10 mots.
  • Les textes ne peuvent pas contenir plus de 65 535 mots.
  • Le serveur ne peut pas recevoir plus de 1024 requêtes simultanées.
  • Les valeurs dans les champs filtrable ne peut dépasser 500 octets.
  • Par défaut, un maximum de 1000 résultats sera renvoyé.
  • L'index ne peut pas dépasser 500Go.

Ces limitations vont surtout concerner les applications qui ont une très grosse quantité d'informations à stocker mais à ce stade là il est intéréssant d'investir dans une solution plus complexe / adapté à ces besoins.

Ensuite, il est important de noter que la plupart des points d'entrées d'API sont asynchrones et ne font que renvoyer une tâche, ce qui peut être génant pour capturer des erreurs.

Comparaison

Maintenant, on peut se demander la place de Meilisearch vis à vis de ce qui existe déjà en terme de bases de données orientées recherche. La documentation offre un tableau comparatif vis à vis des différentes solutions (attention le tableau risque d'être orienté en faveur de Meilisearch vu qu'ils en sont l'auteur).

PostgreSQL et MySQL

Il est possible d'obtenir des fonctionnalités de recherche full text avec des bases de données relationnelles classiques (avec MATCH AGAINST pour Mysql et le type de recherche pour PostgreSQL). Malheureusement, le fonctionnement n'est pas forcément évident avec des requêtes SQL complexes.

/** Création du vecteur de recherche lors d'une mise à jour **/
CREATE FUNCTION update_forum_document() RETURNS trigger AS $$
begin 
    new.search_vector := setweight(to_tsvector('french', coalesce(new.name, '')), 'A')
|| setweight(to_tsvector('french', coalesce(new.content, '')), 'B');
return new;
end
$$ LANGUAGE plpgsql;
CREATE TRIGGER update_forum_document_trigger BEFORE INSERT OR UPDATE ON forum_topic FOR EACH ROW EXECUTE PROCEDURE update_forum_document();

/* Requête de recherche */
SELECT 
    ts_headline('french', content, $tsQuery, 'MaxWords=70, MinWords=30, StartSel=<mark>, StopSel=</mark>') as excerpt,
    t.id,
    ts_headline('french', name, $tsQuery, 'MaxWords=70, MinWords=30, StartSel=<mark>, StopSel=</mark>') as name,
    t.solved,
    t.message_count,
    t.created_at,
FROM forum_topic t
WHERE t.search_vector @@ $tsQuery
ORDER BY ts_rank(t.search_vector, $tsQuery) DESC
OFFSET :offset
LIMIT 10

En plus de cela, par défaut les recherches sont souvent lentes et nécessite pas mal d'optimisations pour avoir un résultat satisfaisant.

ElasticSearch

ElasticSearch reste l'outil de référence lorsque l'on parle de recherche mais son utilisation est à mon sens beaucoup trop complexe pour des cas simples. Cette complexité se traduit souvent, à cause d'un manque d'expertise, par un index mal configuré et peu efficace (ce qui donne une recherche qui ne trouve pas les bons résultats...).

Typesense

Typesense propose une solution similaire à Meilisearch avec un simple éxécutable (écrit en C++) et une API HTTP. Cependant Typesense n'est pas encore disponible en version stable. Aussi, son utilisation m'a semblé un peu plus complexe à cause de la nécessité de créer les schémas en amont et j'avais quelques problèmes lors de ma courte expérience avec l'outil (à voir comment cela évolue).

  • Les données sont stockées en mémoire (ce qui peut être limitant)
  • Contrôle limité pour le surlignage des mots clefs et le rognage des textes autour du surlignage.

Algolia

Algolia est un service tiers spécialisé dans la recherche. Il n'existe malheureusement pas possible d'héberger leur solution ce qui rend dépendant de leur service. Avec Meilisearch on peut faire le choix d'utiliser ou non leur service cloud (qui semble d'ailleurs moins cher qu'Algolia).

Publié
Technologies utilisées
Auteur :
Grafikart
Partager