Articles sur Elasticsearch

Share Button

Read the English version

Au cours de récents projets, nous avons été amenés à travailler sur des moteurs de recherche dans des domaines complètement différents :

  • 2 moteurs de recherche multi-critères front-office (orientés utilisateurs)
  • 2 moteurs de recherche multi-critère back-office (orientés administrateurs)
  • un moteur de statistiques (calculs, aggrégations, sommes, moyennes, …)

Réaliser ces moteurs sur une base de données se serait révélé coûteux (en temps de développement mais aussi au niveau des performances) pour des résultats mitigés (aussi bien au niveau statistiques, qu’au niveau recherche “texte”).

Pour cela, nous nous sommes tournés vers Elasticsearch : moteur de recherche basé sur Lucene. Voici le résultat de nos péripéties : 11 articles.


Deux articles pour comprendre ElasticSearch quel que soit le langage
Cinq pour les développeurs Symfony,
Trois pour les développeurs PHP en général,
Un article pour trouver son chemin,
Un article pour les gouverner tous,
Un article pour les trouver,
Un article pour les amener tous
Et dans les ténèbres les lier.

Ces articles vous expliqueront les besoins que nous avions mais surtout les solutions que nous avons pu apporter. A l’heure actuelle tous ne sont pas encore rédigés, mais n’hésitez pas à venir vers nous pour des sujets que nous n’avons pas encore abordés.
Afin de rendre ces articles plus concrets, nous réalisons un projet bac à sable dans lequel vous pourrez voir chacun des points ci-dessous en application.
Il s’agit d’un exemple simple, un blog, qui devrait permettre de tester toutes les fonctionnalités que nous voulons vous présenter. Bien sûr, puisque les articles ne sont pas encore tous rédigés, le projet va évoluer en même temps.

En espérant que ces informations vous permettront d’avancer dans la compréhension de l’outil impressionnant qu’est Elasticsearch…

1 – Installer Elasticsearch sous Symfony en 3 minutes.

Cet article présente l’installation et la première configuration d’Elasticsearch, mais aussi l’installation du bundle FOSElasticaBundle et de la librairie Elastica pour PHP. C’est tout, la finalité de cet article est bel et bien d’avoir une instance fonctionnelle d’Elasticsearch sur votre poste.
Lire l’article

2 – Indexation et Recherche simple sur Elasticsearch avec Symfony

La base ! Faire un mapping entre un objet Doctrine Symfony et les documents Elasticsearch.
Utilisant l’exemple d’un blog, vous saurez indexer vos premiers objets (ici des articles).
Nous abordons la configuration du FOSElasticaBundle, la création d’un objet de recherche et du formulaire associé.
A la fin de cet article, vous aurez une recherche simple :

  • Recherche par titre (Approximation des termes)
  • Recherche par date
  • Recherche par état (publié ou non)

Lire l’article

3 – Paginer et trier ses résultats avec Elasticsearch et Symfony

Votre recherche est fonctionnelle, mais tout bon moteur de recherche vient avec une pagination et un tri (par date, par pertinence, …). C’est le but de cet article : ajouter une pagination et un tri à votre objet de recherche, et en tenir compte au moment de faire la requête vers Elasticsearch.
Lire l’article

4 – Configuration d’indexation Elasticsearch optimale

Lors de l’utilisation des moteurs de recherche à base de texte, 2 moments sont importants :

  • L’indexation : La manière dont le texte est indexé influencera la pertinence et l’utilité du moteur : le découpage des mots, la suppression des mots inutiles, la normalisation (caractères unicode), l’indexation par synonymes, …
  • La recherche : De même, le nettoyage de la “query string” (texte recherché) est primordial. La suppression des caractères inutiles permet d’accroître la pertinence des résultats.

Cet article traite principalement de la configuration des analyseurs de texte lors de l’indexation et de la recherche. On vous explique pourquoi et comment utiliser les analyzers.

Lire l’article

5 – Hydrater correctement son objet avec FOSElasticaBundle

FOSElasticaBundle contient un Transformer par défaut qui transforme les résultats envoyés par Elasticsearch en objets Doctrine.
Le problème est que les objets en jointure ne sont pas récupérés automatiquement (le Lazy Loading de Doctrine).
Cet article aborde ce (petit) problème et vous permettra d’optimiser considérablement la transformation, c’est-à-dire de réduire le nombre de requêtes en hydratant les jointures directement.
Lire l’article

6 – Exporter en xls/csv avec la fonction scroll d’Elasticsearch

Comment exporter les résultats d’une recherche dans un fichier csv ou un xls, le tout sans obstruer la mémoire du serveur. La réponse est dans cet article : utiliser la fonction scroll d’Elasticsearch.
Lire l’article

7 – Recherche avancée (Object, Nested, hasParent, hasChild) avec Elasticsearch

Dans un système de données non relationnel, le manque de jointures peut représenter un obstacle.
Heureusement, Elasticsearch propose des solutions pour répondre à ces besoins!

Cet article présente donc les differentes manières de lier des objets, leurs avantages et leurs limitations.
Lire l’article

8 – Elasticsearch et agrégations, le futur des facettes

Elasticsearch est capable d’indexer d’énormes volumes de données, aussi bien des documents que des chiffres.
Dans les versions inférieures à la v1.0.0, les facettes permettaient de récupérer des statistiques pour une liste de documents indexés (répartition par tag, moyenne, écart-type,…)
Au fil du temps, l’utilisation de ces facettes a évolué. Les développeurs ont souhaité s’en servir pour réaliser des statistiques de plus en plus poussées.
En réponse à cela, la géniale équipe Elasticsearch a ajouté l’implémentation des agrégations :
- Métriques : Somme, minimum, maximum, moyenne, ….
- “Buckets” : Répartition par terme, par date, par valeur, … Ces agrégations peuvent contenir des sous-agrégations. On peut donc calculer des statistiques dans une répartition par terme, un truc de malade!
Le but de cet article est de décrire une des utilisations qui peuvent être faites de ces agrégations : des statistiques.
Lire l’article

9 – Créer un classement à l’aide des agrégations d’Elasticsearch (A venir…)

Dans ce deuxième article sur les agrégations, nous réaliserons un classement. Une utilisation un peu différente.

10 – Indexation avancée : utilisation des ModelToElasticaTransformer

Le mapping simple Doctrine <-> Elasticsearch est réalisé automatiquement par FOSElasticaBundle.
Lors d’une utilisation plus poussée d’Elasticsearch, vous rencontrerez peut être le besoin de personnaliser au maximum votre indexation (pré-calcul de données, objets, nested, requêtes sql spécifiques, …)
Pour ce faire, FOSElasticaBundle permet la personnalisation du transformer Object (orm/odm) -> Document (Elasticsearch).
Cet article vous explique rapidement comment utiliser cette fonctionnalité.
Lire l’article
Nous espérons vous faire découvrir un maximum les fonctionnalités d’Elasticsearch via ces articles !

Rappel: les sources du projet-exemple utilisé pour ces articles est disponible sur Github. Le projet va évoluer au fur et à mesure de la rédaction des articles.

Share Button

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Protected by WP Anti Spam