giphy

ElasticSearch : Explication, Introduction et mise en pratique via FOSElastica Bundle

Le client veut une recherche de dingue !

Et oui y’en as marre de la recherche toute pourrite à base de like en sql ! Non, on veut du gros, du gras, de la recherche phonétique  sur laquelle on met du filtre et le tout (presque)instantanément. Oui on veut de l’elasticsearch !

Mais elasticsearch c’est quoi ? Et bien c’est un moteur de recherche open source écrit en java basé sur Lucene. Il utilise une base de donnée NoSQL, codé au format JSON, qu’il indexe et interroge via une API rest.
Autrement dit via une requête HTTP PUT il va remplir et/ou mettre à jour ces fichiers JSON (la base de donnée) et via une autre requête HTTP GET il va accéder à ces données, et nous renvoyer ce qu’on recherche dans notre cher projet.

Il y en d’autres hein, comme dans tout rest le POST et le DELETE sont de la partie aussi.

 

We need to go deeper

OK mais comment ça marche la bête ? Pour comprendre il faut connaitre les termes utilisés dans le monde elastic.

Cluster : Le cluster est formé d’un ou plusieurs nodes. Le cluster va accueillir tout nos nodes et donc toutes nos données. Un cluster est formellement identifier  par un nom. Par défaut ce nom est ‘elasticsearch’ mais on peut le modifier comme on le souhaite. Vous y viendrez si vous voulez plusieurs clusters.

Node : C’est une instance d’elasticsearch. Il fait partie de votre cluster comme dit plus haut. Il stocke vos données, participe à l’indexation mais aussi à la recherche. Comme le cluster, le node est identifié par un nom. Par défaut il lui est attribué un nom de héros Marvel (!!). Je vous conseille Iron Man, car Iron Man il est cool. Un node peut être configuré pour joindre un cluster spécifique par le nom de ce dernier, par défaut il cherchera à aller dans le cluster ‘elasticsearch’. Donc si vous ne touchez à rien et que vous lancer plusieurs nodes sur votre serveur, vous aurez alors plusieurs héros Marvel qui vont tout se joindre au cluster ‘elasticsearch’ ensemble. Tout  ça sachant que vous pouvez avoir autant de nodes que vous voulez dans un cluster.

Index : Un index est une collection de document qui ont tous un point commun. Un index peut regrouper tous vos utilisateurs, un autre tout vos articles. En faite vous pouvez mettre n’importe quoi à partir du moment ou ces données on un point commun et qu’il est logique de les classer dans le même index pour une recherche.

Type : Il s’agit du typage  des index. Par exemple dans votre index article vous pouvez les typer par article sur Symfony2, Doctrine, MySQL etc etc..

Document :  C’est dans le document qu’est représentée la donnée. Elle est organisée avec des champs. De la même façon qu’une table avec des champs en MySQL. Cependant ici il s’agit d’une représentation NoSQL en JSON.

 

Installation

Je vais ici montrer la manière d’installer elasticsearch en services sur Linux Debian/Ubuntu.

Si vous n’êtes pas sur Linux ou si vous ne souhaitez pas l’installer en service allez voir de ce coté la.

On doit d’abord installer JAVA indispensable au bon fonctionement d’elastic :

 

On va chercher le package via wget

On installe ensuite notre paquet

Par défaut elasticsearch n’est pas configuré pour redémarrer à chaque reboot serveur. On trouve cependant dans la documentation officiel une commande pour ça:

Si vous souhaitez changer de nom de cluster et/ou de node ça se passe dans un fichier de config YAML à cette emplacement : /etc/elasticsearch/elasticsearch.yml

Quand tout est prêt lancer votre service comme n’importe qu’elle autre service :

Pour savoir si votre elasticsearch marche bien rendez-vous à cette adresse : http://localhost:9200

 

Les API REST c’est le bien

hap

Et oui, c’est le bien, et elastissearch l’utilise et en abuse !
Ce format bien précis est utilisé pour y accéder :

Pour qu’elastic puisse trouver vos données il va falloir les indexer, cet à dire stocker tout ce que vous voulez dans sa base de données à lui.

Commençons par le commencement pour comprendre on va utiliser notre bon vieux terminal et on va indexer des données via CURL :

Alors qu’avons nous fait ici ?

On as simplement indexer notre article, via un PUT, dans l’index ‘article’ et le type ‘elasticsearch’, que nous avons créés au passage, on y a mit quatre champs avec des données qui sont désormais accessible à une recherche !

Un joli message de type “{“_index”:”article”,”_type”:”elasticsearch”,”_id”:”1″,”_version”:1,”created”:true}” a dut apparaître nous indiquant que tout c’est bien passé, on peut maintenant faire une recherche !

OUI ! Nous avons fait une recherche sur oui et Elastic malin comme il est, il à trouvé quelque chose :

{“took”:2,”timed_out”:false,”_shards”:{“total”:5,”successful”:5,”failed”:0},”hits”:{“total”:1,”max_score”:0.067124054,”hits”:[{“_index”:”article”,”_type”:”elasticsearch”,”_id”:”1″,”_score”:0.067124054,”_source”:{
“titre” : “ElasticSearch est le meilleur moteur de recherche”,
“contenu” : “Oui en effet”,
“date” : “2012-12-21T00:00:00”,
“url”: “http://www.jesuisundev.fr/introduction-explication-elasticsearch/”
}}]}}

C’est bien nos données et il est a trouvées car le mot ‘oui’ y apparaît !

De base il y a des trucs bien sympa genre :

Le mot oui est mal orthographié et pourtant  notre article est trouvé  grace au caractère : ‘~’ .

Il s’agit ici d’un seule épisode de ce que propose l’API d’elastic. La série entière est ici.

 

 OK c’est cool mais on va pas tout se taper à la main

Bien sur que non et c’est la qu’intervient nos amis de chez FOS et leur bundle !

Alors, je sous-entend que vous bosser sur Symfony2. Bien sur, vous bosser sur Symfony2 hein ? Non?! Bon sinon il y a l’api PHP officiel  par la.

Concernant l’installation, je ne reviens pas dessus c’est clair, simple et limpide sur le Github.

Par contre au niveau de la  config on va regarder un petit peu :

Ici nous avons indiquer que notre host est la maison (localhost) et qu’il faut taper sur le port 9200.

Ensuite nous avons indiquer que l’index ou stocker nos données est ‘jesuisundev’. Nous avons demandé l’indexation de deux types dans cette index : ‘article’ et ‘user’.

Nous avons choisit qu’elle champs de notre entité sont indexés,  mais surtout demandé au bundle d’utiliser nos entités via doctrine ORM.
Le listener est la pour savoir quand et comment indexer vos nouvelles données.

Le tout étant évidement configurable, vous trouverez plus d’info par ici.

Cette commande dans votre terminal et la magie opère ! Tout ce qui trouve dans votre entité sera indexé de façon automatique et disponible à la recherche ! Un petit coup d’utilisation de service est il  y à plus qu’a afficher !

Épilogue

On pourrait écrire un livre sur Elasticsearch. En fait on pourrait faire plusieurs tomes.

Ici nous avons juste fait une introduction basique sur une première utilisation.

Mais cet outil est fait pour aller beaucoup plus loin, des recherches phonétiques, de la pluralisation, de l’adaptation à chaque langue, l’utilisation de facettes, des filtres à gogo et bien d’autres vous attendent avec ce fabuleux outil qui s’appelle google.

Ou alors, vous attendez mon second article la dessus 😉