Plan du site  
pixel
pixel

Articles - Étudiants SUPINFO

Introduction à ElasticSearch

Par Jean-Baptiste EVIEUX Publié le 31/10/2015 à 19:50:29 Noter cet article:
(0 votes)
Avis favorable du comité de lecture

Nous évoluons dans un monde où l’on a besoin de stocker de plus en plus d'informations chaque jour mais également de pouvoir rechercher des informations de façon toujours plus rapide et efficace. Une recherche dans, par exemple, une base de données relationnelle peut paraître simple et rapide si la requête est bien construite avec les jointures nécessaires entre les tables. Malheureusement, plus cette base de données va grossir, plus les requêtes seront longues à exécuter surtout dans le cas où la recherche implique une ou plusieurs jointures de tables. C'est à cette problématique qu'ElasticSearch essaye de répondre.

ElasticSearch est un moteur de stockage et de recherche de données puissant basé sur Lucène (un projet d'Apache Software Foundation). ElasticSearch a été développé en Java et est distribué de façon open source sous licence Apache 2.0. Il fournit un moteur de recherche "full-text" multitenant avec une API RESTFul et dont les entités sont sauvegardées sous forme de documents JSON. Il a été conçu dans l'optique d'être évolutif, avec un système de clustering, de loadbalancing et est capable de reconstruire les données perdues dû à, par exemple, un node défectueux.

Installation

Pré-requis

ElasticSearch étant développé en Java, il vous faut tout d'abord installer Java à l'adresse suivante: https://java.com/fr/download/. Une fois la dernière version de Java installée, il vous faut modifier ou créer votre JAVA_HOME dans les variables d'environnement système en donnant comme valeur le chemin complet vers votre dossier de Java (attention de ne pas mettre le chemin vers le dossier /bin).

ElasticSearch

Une fois les pré-requis terminés, il est temps d'installer ElasticSearch en commençant par le télécharger depuis le site d'ElasticSearch, puis cliquez sur ZIP (pour Windows) pour le télécharger. Ci-dessous un aperçu de la page de téléchargement:

Une fois le zip téléchargé, décompressez le où vous voulez (en ce qui me concerne, je l'ai décompressé dans C:\Program Files (x86) ce qui me permet d'accéder au dossier racine d'ElasticSearch via le chemin complet: C:\Program Files (x86)\ElasticSearch-1.7.3). Nous allons ensuite ouvrir une console dans le dossier "bin" et installer le plugin Marvel en tapant la commande suivante:

plugin -i ElasticSearch/marvel/latest

Le plugin Marvel permet de monitorer et d'optimiser notre ElasticSearch en fournissant des statistiques détaillées sur le cluster et les nodes qui y résident. De plus, il intègre un outil nommé Sense qui nous permettra d'envoyer des requêtes à notre ElasticSearch (cela nous évitera de passer par curl ou des outils comme Fiddler ou Postman pour utiliser l'API d'ElasticSearch.

Lancez ensuite ElasticSearch via la commande "elasticearch":

C:\Program Files (x86)\ElasticSearch-1.7.3\bin>elasticsearch
[2015-10-27 21:37:55,158][INFO ][node                     ] [Richard Fisk] version[1.7.3], pid[5404], build[05d4530/2015-10-15T09:14:17Z]
[2015-10-27 21:37:55,183][INFO ][node                     ] [Richard Fisk] initializing ...
[2015-10-27 21:37:55,450][INFO ][plugins                  ] [Richard Fisk] loaded [], sites []
[2015-10-27 21:37:55,620][INFO ][env                      ] [Richard Fisk] using [1] data paths, mounts [[(C:)]], net usable_space [71.8gb], net total_space [465.6gb], types [NTFS]
[2015-10-27 21:38:00,840][INFO ][node                     ] [Richard Fisk] initialized
[2015-10-27 21:38:00,840][INFO ][node                     ] [Richard Fisk] starting ...
[2015-10-27 21:38:01,866][INFO ][transport                ] [Richard Fisk] bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[/192.168.1.15:9300]}
[2015-10-27 21:38:03,739][INFO ][discovery                ] [Richard Fisk] ElasticSearch/aeUBy7_xQQ2TbD3IOmJUOQ
[2015-10-27 21:38:07,529][INFO ][cluster.service          ] [Richard Fisk] new_master [Richard Fisk][aeUBy7_xQQ2TbD3IOmJUOQ][Nom-PC][inet[/192.168.1.15:9300]], reason: zen-disco-join (elected_as_master)
[2015-10-27 21:38:07,729][INFO ][gateway                  ] [Richard Fisk] recovered [0] indices into cluster_state
[2015-10-27 21:38:08,221][INFO ][http                     ] [Richard Fisk] bound_address {inet[/0:0:0:0:0:0:0:0:9200]}, publish_address {inet[/192.168.1.15:9200]}
[2015-10-27 21:38:08,224][INFO ][node                     ] [Richard Fisk] started

Sans trop rentrer dans les détails, on peut voir que notre node nommé Richard Fisk (qui devrait porter un autre nom dans votre cas) a démarré et s'est élu comme "master" dans un seul cluster. Nous pouvons maintenant accéder à la page du plugin Marvel via l'url suivante: http://localhost:9200/_plugin/marvel

Vous devriez obtenir la page de monitoring de votre ElasticSearch:

Vous devrez ensuite cliquer sur Dashboards > Sense ou via l'url http://localhost:9200/_plugin/marvel/sense/ pour accéder à la page de Sense qui va nous permettre de construire et envoyer nos requêtes pour l'API de notre ElasticSearch:

Opérations de CRUD

Indexer un document

Dans ElasticSearch, indexer correspond au "Create" et "Update" du CRUD: si on indexe un document avec un type et un id donné qui n'existe pas déjà, il est créé, sinon il est remplacé. Pour pouvoir indexer un document, on crée une requête PUT à l'API sur une url composée du nom de l'index, du nom du type du document et de son id: http://localhost:9200/<index>/<type>/[<id>]

L'index et le type sont obligatoires alors que l'id n'est qu'optionnel. Si on ne spécifie pas d'id, ElasticSearch nous en générera un pour nous. Cela dit, si on décide de ne pas spécifier d'id, on doit dans ce cas utiliser un POST plutôt qu'un PUT. Le nom de l'index est arbitraire, s'il n'y a pas d'index de ce nom, il sera créé en utilisant la configuration par défaut. Concernant le nom du type, il est aussi arbitraire, et sera également créé s'il n'existe pas. Le type a plusieurs spécificités:

  • Chaque type à son propre espace d'id

  • Chaque type différent peut avoir un "mapping" différent (c'est une sorte de schéma qui permet de définir comment les propriétés de ce type de document devront être indexé) .

C'est partit, indexons notre premier document ! On peut indexer à peu près n'importe quoi du moment qu'il peut être représenté sous forme d'un objet JSON. Dans cet article, nous allons indexer et chercher des livres. En voilà un:

Nous avons donc indexé notre livre dans un index nommé "products", avec le type nommé "book" et avec l'id "1". En envoyant la requête (via la flèche verte), nous avons reçu une réponse d'ElasticSearch sous la forme d'un objet JSON également. Il contient les informations concernant l'opération d'indexation comme l'id du document, sa version et s'il a fait une opération de création ou de remplacement du document.

Pour vérifier le document indexé, il nous suffit de lister le contenu de l'index "products" qui a pour type "book" en faisant une requête GET sur l'url http://localhost:9200/products/book/_search

Nous pouvons inspecter la réponse et voir qu'ElasticSearch a mis qu'une seule milliseconde pour nous retourner les résultats de la recherche. Le document indexé possède des informations supplémentaires relatives au système interne d'ElasticSearch comme le nom de l'index, le type, l'id, et le document d'origine. Le score quant à lui n'est pas indexé mais calculé au moment de la requête et permet de trier les réponses par pertinence selon les critères de la requête d'origine mais cela sort du contexte de cet article. Pour plus d'information sur le scoring consulter le chapitre "Controlling Relevance" du guide d'ElasticSearch.

Pour les besoins de cet article, nous allons indexer 3 autres documents:

Si nous relistons les livres, nous devrions obtenir nos 4 documents:

Maintenant que nous avons des livres dans notre index, voyons comment pouvons-nous en mettre à jour l'un d'entre eux. Pour cela, nous indexons à nouveau le document en utilisant le même id. Donc nous allons réaliser la même requête que pour l'indexation initiale du document mais avec les nouvelles modifications (ici j'ai mis à jour le champ "price"):

La réponse d'ElasticSearch est la même que pour l'indexation initiale à l'exception du champ "_version" qui a changé de la valeur 1 à la valeur 2 et du champ "created" qui à maintenant la valeur false car en effet, il ne s'agit pas d'une création de document, mais un remplacement. À noter qu'ElasticSearch supporte également la mise à jour partielle d'un document via l'endpoint "_update" de l'API.

Retrouver un document par id

Jusqu'à maintenant, nous avons vu comment indexer des nouveaux documents et comment les mettre à jour. On a également vu comment faire une requête de recherche simple avec nos livres indexé dans la réponse. Bien qu'il soit possible de retrouver un seul document via une recherche, il est plus rapide de le retrouver via son id, en utilisant une requête GET. Pour cela, il nous suffit d'utiliser la même url que pour son indexation a part que cette fois-ci l'id est obligatoire: http://localhost:9200/<index>/<type>/<id>

Essayons donc de récupérer le livre portant l'id 1:

Comme vous pouvez le voir, la réponse ressemble beaucoup à la celle que pour son indexation. On y retrouve par exemple l'index, le type, la version mais surtout le document indexé. Il n'y a pas grand-chose à détailler, la requête parle d'elle-même. Passons maintenant à la dernière opération du CRUD.

Supprimer un document par id

Pour supprimer un document de l'index par son id, nous avons encore besoin de la même url que pour l'indexer et le retrouver, mais cette fois nous allons changer la méthode GET pour la méthode DELETE:

La réponse contient les attributs habituels mais également l'attribut "found" qui indique si le document a effectivement été trouvé et que l'opération de suppression a été effectuée avec succès. Après avoir exécuté le DELETE, si on essaye à nouveau d'exécuter le GET nous pourrons constater que le document n'existe plus dans l'index:

Pour les besoins de notre article, je vous demanderai de ré-indexer ce document avec l'id 1.

Rechercher des documents

Maintenant que nous avons des livres dans notre index voyons voir si nous pouvons en retrouver via une recherche. Pour rechercher avec ElasticSearch, on utilise l'endpoint "_search" avec en options, un index et un type spécifié: http://localhost:9200[/<index>][/<type>]/_search

Voici quelques exemples:

Voyons comment cela fonctionne via une série d'exemples:

Recherche par mot
Recherche par mot sur un attribut spécifique
Recherche par tranche de prix

Conclusion

Dans cet article, nous avons vu les opérations de bases relatives à ElasticSearch, c'est à dire l'indexation, la mise à jour, la suppression et la recherche de documents. Malgré les temps de réponse très rapides d'ElasticSearch (de l'ordre de la milliseconde), nous n'avons pas eu l'occasion de tester sa rapidité sur des index contenant des milliers (voir des millions) de documents. Malgré cela, il faut garder en mémoire qu'ElasticSearch a été développé dans l'optique d'être, au final, utilisé pour indexer et rechercher des documents à grande échelle dans son environnement clusturisé qui permet de rajouter de nouvelles instances d'ElasticSearch sur d'autres machines et de les joindre entre eux afin d'augmenter la capacité d'indexation ainsi que les performances. Un outil quasiment indispensable à l'ère du BIG DATA.

A propos de SUPINFO | Contacts & adresses | Enseigner à SUPINFO | Presse | Conditions d'utilisation & Copyright | Respect de la vie privée | Investir
Logo de la société Cisco, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société IBM, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sun-Oracle, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Apple, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sybase, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Novell, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Intel, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Accenture, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société SAP, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Prometric, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Toeic, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo du IT Academy Program par Microsoft, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management

SUPINFO International University
Ecole d'Informatique - IT School
École Supérieure d'Informatique de Paris, leader en France
La Grande Ecole de l'informatique, du numérique et du management
Fondée en 1965, reconnue par l'État. Titre Bac+5 certifié au niveau I.
SUPINFO International University is globally operated by EDUCINVEST Belgium - Avenue Louise, 534 - 1050 Brussels