Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
elasticsearch [Le 10/08/2017, 17:15] fabux Mise en forme lien wikipedia, Lien intra pour mise en forme pré-requis, usage mini-tuto plutot qu'apt-get ou nano, retrait liens répétés (et s'il y a un wpfr pas besoin de wp en plus). |
elasticsearch [Le 30/08/2024, 14:03] (Version actuelle) bcag2 [OpenSearch/Elasticsearch] elasticsearch à nouveau opensource ! |
||
---|---|---|---|
Ligne 3: | Ligne 3: | ||
---- | ---- | ||
- | ====== Elasticsearch ====== | + | ====== OpenSearch/Elasticsearch ====== |
**[[wpfr>Elasticsearch]]** est une base de données documentaire libre se basant sur le serveur Apache [[wpfr>Lucene]].\\ | **[[wpfr>Elasticsearch]]** est une base de données documentaire libre se basant sur le serveur Apache [[wpfr>Lucene]].\\ | ||
Les requêtes se font via le protocole [[wpfr>Hypertext_Transfer_Protocol|HTTP]] et l'interface [[wpfr>Representational_state_transfer|REST]].La requête PUT permet d'ajouter/modifier une entrée tandis que GET permet de la récupérer. L'échange de données se faisant via le format [[wpfr>JavaScript_Object_Notation|JSON]]. | Les requêtes se font via le protocole [[wpfr>Hypertext_Transfer_Protocol|HTTP]] et l'interface [[wpfr>Representational_state_transfer|REST]].La requête PUT permet d'ajouter/modifier une entrée tandis que GET permet de la récupérer. L'échange de données se faisant via le format [[wpfr>JavaScript_Object_Notation|JSON]]. | ||
+ | <note important>En 2021, le changement de licence d'Elasticsearch vers la licence non libre [[wpfr>Server_Side_Public_License|SSPL]] a entraîné la création du fork [[wp>OpenSearch_(software)|OpenSearch]], a priviligier désormais !\\ | ||
+ | Fin août 2024, marche arrière avec l'ajout d'une licence AGPL pour qu'Elasticsearch soit à nouveau open source ((src: https://www.elastic.co/fr/blog/elasticsearch-is-open-source-again et https://sgbd.developpez.com/actu/362095/Elasticsearch-est-a-nouveau-open-source-en-ajoutant-l-AGPL-conforme-a-l-OSI-comme-troisieme-option-apres-trois-ans-ou-les-produits-d-Elastic-ne-possedaient-qu-une-double-licence-non-open-source/)) | ||
+ | </note> | ||
Ce tutoriel a pour but de montrer comment installer basiquement le service Elasticsearch et réaliser des requêtes simples. | Ce tutoriel a pour but de montrer comment installer basiquement le service Elasticsearch et réaliser des requêtes simples. | ||
Les paramètres techniques détaillées et les concepts d'architecture ou de modèle documentaire ne seront pas abordés ici.\\ | Les paramètres techniques détaillées et les concepts d'architecture ou de modèle documentaire ne seront pas abordés ici.\\ | ||
Ligne 18: | Ligne 20: | ||
Pour réaliser ce tutoriel, mieux veut connaitre les bases de : | Pour réaliser ce tutoriel, mieux veut connaitre les bases de : | ||
* L'[[:tutoriel:comment_installer_un_paquet|installation de paquets]] | * L'[[:tutoriel:comment_installer_un_paquet|installation de paquets]] | ||
- | * La [[:tutoriel:comment_modifier_un_fichier|modification de fichiers]] de paramètres ainsi que les [[:sudo|droits d'adminisration]] qui peuvent être nécessaire. | + | * La [[:tutoriel:comment_modifier_un_fichier|modification de fichiers]] de paramètres ainsi que les [[:sudo|droits d'administration]] qui peuvent être nécessaire. |
* L'utilisation des [[:services]] | * L'utilisation des [[:services]] | ||
* Le requêtage HTTP : [[http://www.zem.fr/curl-15-commandes-pratiques-avec-curl/|Tutoriel FR]] ou [[http://www.slashroot.in/curl-command-tutorial-linux-example-usage/|Tutoriel EN]] | * Le requêtage HTTP : [[http://www.zem.fr/curl-15-commandes-pratiques-avec-curl/|Tutoriel FR]] ou [[http://www.slashroot.in/curl-command-tutorial-linux-example-usage/|Tutoriel EN]] | ||
Ligne 43: | Ligne 45: | ||
En effet, si vous saisissez cette commande : | En effet, si vous saisissez cette commande : | ||
<code bash>sudo service elasticsearch status</code> | <code bash>sudo service elasticsearch status</code> | ||
- | Alors vous devriez voir un **active (exited)** qui indique que la commande de lancement a été exécutée mais qu'on n'est pas sûr de l'état du service : | + | Alors vous devriez voir un **active (exited)** qui indique que la commande de lancement a été exécutée mais qu'on n'est pas sûr de l'état du service : |
<code bash>● elasticsearch.service - LSB: Starts elasticsearch | <code bash>● elasticsearch.service - LSB: Starts elasticsearch | ||
Loaded: loaded (/etc/init.d/elasticsearch; bad; vendor preset: enabled) | Loaded: loaded (/etc/init.d/elasticsearch; bad; vendor preset: enabled) | ||
Ligne 68: | Ligne 70: | ||
<note help> FIXME A quoi servent réellement ces commandes ? | <note help> FIXME A quoi servent réellement ces commandes ? | ||
* D'un côté la variable //START_DAEMON// n'est pas utilisée dans la suite du script. Donc pourquoi forcer l'arrêt du script si elle n'existe pas ? | * D'un côté la variable //START_DAEMON// n'est pas utilisée dans la suite du script. Donc pourquoi forcer l'arrêt du script si elle n'existe pas ? | ||
- | * Ensuite, le groupe défini par la variable //ES_USER// ne semble pas avoir le droit de lancer le démon alors que l'utilisateur référencé par la même variable lui le peut. | + | * Ensuite, le groupe défini par la variable //ES_USER// ne semble pas avoir le droit de lancer le démon alors que l'utilisateur référencé par la même variable lui le peut. |
Bizarre.</note> | Bizarre.</note> | ||
Ligne 140: | Ligne 142: | ||
====Opérations de base==== | ====Opérations de base==== | ||
+ | <note tip>Les exemples ci-dessous utilisent la [[:tutoriel/console_commandes_de_base|commande]] //curl//, il est possible de l'agrémenter de la commande [[:json_query]],\\ | ||
+ | voire d'installer le logiciel [[https://insomnia.rest/|Insomnia]](OSS)</note> | ||
Dans un base de données, il existe 4 opérations de base. Elles sont synthétisées sous l'acronyme [[wpfr>CRUD|CRUD]] : | Dans un base de données, il existe 4 opérations de base. Elles sont synthétisées sous l'acronyme [[wpfr>CRUD|CRUD]] : | ||
- **C**reate : création d'une donnée | - **C**reate : création d'une donnée | ||
- | - **D**elete : supression d'une donnée | ||
- **R**ead : lecture d'une donnée | - **R**ead : lecture d'une donnée | ||
- **U**pdate : mise-à-jour d'une donnée | - **U**pdate : mise-à-jour d'une donnée | ||
+ | - **D**elete : supression d'une donnée | ||
De même, le protocole [[wpfr>Hypertext_Transfer_Protocol#M.C3.A9thodes|HTTP]] possède, entre autres, 4 méthodes : | De même, le protocole [[wpfr>Hypertext_Transfer_Protocol#M.C3.A9thodes|HTTP]] possède, entre autres, 4 méthodes : | ||
- | - **G**ET : accession à une ressource | ||
- **P**OST : publication d'une nouvelle ressource | - **P**OST : publication d'une nouvelle ressource | ||
+ | - **G**ET : accession à une ressource | ||
- **P**UT : mise-à-jour d'une ressource existante (création si elle n'existe pas) | - **P**UT : mise-à-jour d'une ressource existante (création si elle n'existe pas) | ||
- **D**ELETE : suppression d'une donnée | - **D**ELETE : suppression d'une donnée | ||
Ligne 155: | Ligne 159: | ||
Dans le cadre d'Elasticsearch, on peut donc faire le rapprochement : | Dans le cadre d'Elasticsearch, on peut donc faire le rapprochement : | ||
- Create ↔ POST | - Create ↔ POST | ||
- | - Delete ↔ DELETE | ||
- Read ↔ GET | - Read ↔ GET | ||
- Update ↔ PUT | - Update ↔ PUT | ||
+ | - Delete ↔ DELETE | ||
- | ===Indexation=== | + | === Indexation === |
- | <note tip>Elastic ne fait pas de différence fondamental entre "Create ↔ POST" et "Update ↔ PUT". Ces 2 opérations se confondent en une seule : l'indexation.</note> | + | <note tip>Elastic ne fait pas de différence fondamental entre "Create ↔ POST" et "Update ↔ PUT". Ces 2 opérations se confondent en une seule : l'indexation.\\ |
+ | Notez cependant qu'avec POST, l'identifiant est auto-généré, comme un aute-incrément de base de données, alors qu'aver PUT, vous pouvez spécifier la valeur de l'identifiant ((https://stackoverflow.com/a/56766777)), ce qui peut être intéressant lors de l'indexation d'une base relationnelle</note> | ||
+ | |||
+ | Pour ajouter un enregistrement dans Elasticsearch, on peut prendre comme exemple une méthode PUT : | ||
+ | À partir de la version 7, le //type// disparaît de l'url ((https://www.elastic.co/guide/en/elasticsearch/reference/7.17/removal-of-types.html)) | ||
+ | == avec ES version 8 == | ||
+ | <code bash>curl -XPUT "http://localhost:9200/movies/_doc/1" -d' | ||
+ | { | ||
+ | "movie": { | ||
+ | "title": "The Godfather", | ||
+ | "director": "Francis Ford Coppola", | ||
+ | "year": 1972 | ||
+ | } | ||
+ | }'</code> | ||
- | Pour ajouter un enregistrement dans Elasticsearch, on peut prendre comme exemple un méthode PUT : | + | == avec ES version < 7 == |
<code bash>curl -XPUT "http://localhost:9200/movies/movie/1" -d' | <code bash>curl -XPUT "http://localhost:9200/movies/movie/1" -d' | ||
{ | { | ||
Ligne 241: | Ligne 258: | ||
===Lecture sur un index=== | ===Lecture sur un index=== | ||
+ | <note important>Comme déjà préciser lors du PUT, à partir d'ES v7, il n'y a plus de //type//, les requêtes GET s'en trouvent aussi modifiées</note> | ||
Maintenant que nous avons créé et modifié des enregistrements, il est facilement possible de les récupérer via la méthode ''GET'' en utilisant uniquement les IDs. Par exemple, pour récupérer notre premier film : | Maintenant que nous avons créé et modifié des enregistrements, il est facilement possible de les récupérer via la méthode ''GET'' en utilisant uniquement les IDs. Par exemple, pour récupérer notre premier film : | ||
+ | == avec ES version 8 == | ||
+ | <code bash>curl -XGET "http://localhost:9200/movies/_doc/1"</code> | ||
+ | |||
+ | == avec ES version < 7 | ||
<code bash>curl -XGET "http://localhost:9200/movies/movie/1"</code> | <code bash>curl -XGET "http://localhost:9200/movies/movie/1"</code> | ||
On reçoit en réponse quelque chose de similaire à l'indexation, mais : | On reçoit en réponse quelque chose de similaire à l'indexation, mais : | ||
Ligne 476: | Ligne 498: | ||
} | } | ||
}'</code> | }'</code> | ||
- | Ce qui va renvoyés 2 résultats au format déjà connu : | + | Ce qui va renvoyer 2 résultats au format déjà connu : |
<code bash>{"took":5,"timed_out":false,"_shards":{"total":1,"successful":1,"failed":0},"hits":{"total":2,"max_score":0.36067212,"hits":[{"_index":"movies","_type":"movie","_id":"2","_score":0.36067212,"_source": | <code bash>{"took":5,"timed_out":false,"_shards":{"total":1,"successful":1,"failed":0},"hits":{"total":2,"max_score":0.36067212,"hits":[{"_index":"movies","_type":"movie","_id":"2","_score":0.36067212,"_source": | ||
{ | { | ||
Ligne 529: | Ligne 551: | ||
<note>La différence entre query et filter est assez subtile : | <note>La différence entre query et filter est assez subtile : | ||
- | * **query** fait une recherche élargie : tout enregistrement correspond partiellement à la requête sera retourné. Ce genre de recherche est donc plus lent. Il est utile pour faire les recherches à partir de champs saisis par un utilisateurs. | + | * **query** fait une recherche élargie : tout enregistrement correspondant partiellement à la requête sera retourné. Ce genre de recherche est donc plus lent. Il est utile pour faire les recherches à partir de champs saisis par un utilisateurs. |
* **filter** fait une recherche stricte : un document ne ressortira que s'il correspond rigoureusement à tous les critères. Ce genre de recherche est donc plus rapide. Il est utile pour rajouter des contraintes qui seront fixés par le système plus que par l'utilisateur. | * **filter** fait une recherche stricte : un document ne ressortira que s'il correspond rigoureusement à tous les critères. Ce genre de recherche est donc plus rapide. Il est utile pour rajouter des contraintes qui seront fixés par le système plus que par l'utilisateur. | ||
Il faut donc bien réfléchir à la façon dont seront faites les recherches et concevoir les requêtes les plus adaptés au contexte. | Il faut donc bien réfléchir à la façon dont seront faites les recherches et concevoir les requêtes les plus adaptés au contexte. | ||
Ligne 651: | Ligne 673: | ||
* [[https://www.elastic.co/fr/products/elasticsearch|Site du projet]] sur [[https://www.elastic.co/fr|Elastic.co]] | * [[https://www.elastic.co/fr/products/elasticsearch|Site du projet]] sur [[https://www.elastic.co/fr|Elastic.co]] | ||
* [[https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-elasticsearch-on-ubuntu-16-04|How to install Elasticsearch on Ubuntu 16.04]]<sup>(en)</sup> | * [[https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-elasticsearch-on-ubuntu-16-04|How to install Elasticsearch on Ubuntu 16.04]]<sup>(en)</sup> | ||
+ | * [[https://hub.docker.com/_/elasticsearch]] image docker officielle | ||
+ | * [[https://grafikart.fr/tutoriels/elastic-search-626]]<sup>(fr)</sup> tutoriel (2015… //obsolète//), 43mn | ||
+ | * [[https://www.editions-eni.fr/video/elasticsearch-indexez-vos-donnees-pour-une-recherche-efficace-vtelastic|tuto vidéo aux éditions ENI sur la v8]] (PAYANT) | ||
* [[http://joelabrahamsson.com/elasticsearch-101/|How to install Elasticsearch]]<sup>(en)</sup> | * [[http://joelabrahamsson.com/elasticsearch-101/|How to install Elasticsearch]]<sup>(en)</sup> | ||
---- | ---- | ||
- | //Contributeurs:// FIXME | + | //Contributeurs: demi-boulet, [[:utilisateurs/bcag2]]// |