{{tag>sysadmin dbadmin nosql elasticsearch}}
====== Elasticsearch ======
Elasticsearch est un moteur de recherche et d'analyse RESTful distribué et open source. Ces principales fonctionnalités sont:
* Stockage de données fortement orienté texte (technologie nosql)
* Recherche ultra-rapide, une très grande pertinence et des analyse.
* Supporte la mise à l'échelle (scalabilité)
* Interface RESTfull
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):
* **Logstash** permet d'alimenter elasticsearch. Il s'interface entre elasticsearch et les sources de données diverses qu'il formate et normalise.
* **Kibana** est une webUI permettant concevoir des tableaux de bord, de consulter et d'exploiter les données.
On désigne alors cette architecture ELK ((Elasticsearch, Logstach, Kibana))
Quelques exemples et domaines d'application d'Elasticsearch:
* Ajouter une fonction de recherche aux applications et au sites web;
* stockage et analyses des journaux, métriques et événements liés à la sécurité.
* S'associer au machine Learning pour automatiquement analyser, modéliser des comportements déduits des masses de données.
* Automatiser/fluidifier les workflows en entreprise en utilisant Elasticsearch comme moteur de stockage.
* Gérer, intégrer, analyser des informations spatiales en utilisant Elasticsearch comme SIG((Système d'Information Géographique)).
* Stocker et traiter des données génétiques en utilisant Elasticsearch comme outil de recherche bio-informatique.
===== Méthodes d' installation =====
* Pour facilement déployer une instance de test, [[software:applications:elasticsearch:installation_docker|installer elasticsearch via Docker]].
* [[software/applications/elasticsearch/installer_pile_logicielle_elasticsearch|Installation de la pile logicielle elasticsearch]].
===== Notions =====
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:
* de la fréquence des mots dans le document (plus le mot est présent, plus le sujet est ciblé);
* de la taille du document(si on parle de tout, l'importance de chaque mot diminue);
* de la fréquence des mots dans l'ensemble des documents (un mots très fréquent est moins pertinent);
La recherche peut être enrichie en ciblant une partie de la structure du document: titre, métadonnées etc.
* Elasticsearch stocke les structures de données complexes sous la forme de **documents** JSON sérialisés.
* Un **index** accueillera un ensemble de documents ayant une même structure.
* Le premier document importé déclarera le **schéma** (la structure des documents) s'il n'existait pas. Le schéma peut être définit finement avant le premier import.
* Tous les documents ajoutés par la suite à cet index devront respecter le même schéma, c'est à dire respecter la exactement la même structure (même clés, même types de données, même ordre).
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:
* Distinguer les champs(fields) de texte brute et les champs de valeurs;
* D'effectuer des analyses adaptés aux langues
* Optimiser la déclaration des champs pour les recherches
* D'utiliser des types de données tels que les geo_point ou geo_shape qui ne peuvent pas être automatiquement détectés.
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.
==== Recherche ====
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**.
==== Analyse ====
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:
* Combien d'aiguilles se trouvent dans la botte de foin?
* Quelle est la taille moyenne des aiguilles?
* Quelle est la taille médiane des aiguilles, ventilée par fabricant?
* Combien d'aiguilles se sont retrouvées dans la botte de foin ces six derniers mois?
* Quel est le fabricant d'aiguille le plus populaire?
* Il y a t il des lots d'aiguilles inhabituelles ou anormales?
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.
==== Architecture ====
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.
===== Premiers pas =====
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
===== Paramétrages =====
===== Références =====
* https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html
* https://www.elastic.co/guide/en/elasticsearch/reference/current/documents-indices.html
* https://www.ionos.fr/digitalguide/serveur/configuration/elasticsearch/
* https://www.dailymotion.com/video/xui3nz