Elasticsearch est un moteur de recherche et d'analyse RESTful distribué et open source. Ces principales fonctionnalités sont:
C'est un moteur de recherche hautement paramétrable permettant de s'adapter aux spécificités et aux besoins en traitement des données de l'utilisateur.
Elasticsearch est utilisé avec d'autres outils pour former la stack Elastic (anciennement ELK):
On désigne alors cette architecture ELK 1)
Quelques exemples et domaines d'application d'Elasticsearch:
Elasticsearch s'appuie sur Apache Lucene. Tous les mots d'un texte ont leur importance et on peut effectuer des recherches sur ces mots. Pour pouvoir évaluer la pertinence d'une réponse, la seule présence ou absence du mot ne suffit pas. Il est important d'appréhender certaines généralités sur le processus de scoring afin d'écrire précisément sa requête et analyser correctement les résultats. Le moteur va chercher à déterminer un poids pour chaque mot afin d'établir un score pour chaque réponse en tenant compte:
La recherche peut être enrichie en ciblant une partie de la structure du document: titre, métadonnées etc.
Si un schéma n'est pas définit en amont, Elasticsearch sera capable de le déduire du premier import (comportement dit schema-less) cependant l'utilisateur saura mieux qu'Elasticsearch comment décrire et utiliser ses données. Défénir son propre mapping permet de:
Il est souvent très utile d'indexer le même champ de différentes manières. Il peut être intéressant d'indexer un même champ comme texte brute pour les cherches texte plein et comme champ mot clé pour le tri ou l'agrégation des résultats.
Elasticsearch bénéficie de la pleine puissance des fonctionnalités de recherche d'Apache Lucene qu'il rend accessible au travers d'une API RESTfull permettant de gérer le cluster, indexer et rechercher les données.
L'API REST supporte des requêtes structurées, plein-texte ou complexe (combinaison des deux précédentes). Les requêtes structurées sont similaires à celles que l'on construit avec SQL. Les requêtes plein-texte trouvent tous les documents correspondant à la requête et les retournent classés par pertinence. Elasticsearch est également capable de stocker des structures de données optimisées pour des recherches sur des types de données numériques ou géospatiales.
Elasticsearch propose un langage de requête compréhensible s'appuyant sur la syntaxe JSON le Query DSL.
Les agrégations avec Elasticsearch permettent de concevoir des résumés complexes sur les données et d'obtenir des indicateurs clés, des modèles. En plus de pouvoir retrouver “l'aiguille dans la botte de foin” les agrégations permettent de répondre au questions du type:
Les agrégations utilisent les même structures de données et mécanismes que les recherches permettant d'obtenir des résultats quasiment temps réel (de l'ordre de la seconde). Les tableaux de bords et rapports sont à jour dès que les données changent.
Elasticsearch permet sur une même requête de rechercher, filtrer des documents et effectuer des analyses.
La mise à l'échelle et la résilience du système est mise en œuvre grâce aux nodes, clusters et shards. Elasticsearch est conçu pour être hautement disponible et pour s'adapter au changement d'échelle. C'est une application distribuée par nature. Ajouter des serveurs (désignés nodes) au cluster (grappe de serveurs) augmente automatiquement la capacité d'Elasticsearch, distribue les données et réparti la charge des requêtes sur les différents nœuds. Plus on ajoute des nodes, mieux se comporte l'application.
Un index Elasticsearch est en réalité l'union d'un ou plusieurs shards(fragments) physiques. Chaque fragment physique est un index autonome. Elasticsearch distribue les documents dans un index au travers de multiples shards sur de multiples nodes mettant également en œuvre de la redondance permettant à la fois de protéger les données contre les défaillances matérielles et augmentant les capacités d'absorber la charge des requêtes. Lorsqu'un cluster s'agrandit(grow) ou rétrécit(shrink) Elasticsearch redistribue automatiquement les fragments.
Afin de se familiariser avec Elasticsearch, on utilise un client REST simple pour manipuler les documents.
Création d'un index:
http --json PUT localhost:9200/bibliography/_create/1 \ author="Wiliam Gibson" \ title="Neuromancien" \ year:=1984 \ category:='["SF","nouvelle"]'
Mettre a jour:
http --json PUT :9200/bibliography/_doc/1 \ author="Wiliam Gibson" \ title="Neuromancien" \ year="1984" \ category="SF"
Supprimer un document:
http delete :9200/bibliography/_doc/1