Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
elasticsearch [Le 23/09/2016, 19:41]
demi-boulet [Recherches avancées]
elasticsearch [Le 25/09/2023, 14:53] (Version actuelle)
92.174.107.9 Rangement ordre
Ligne 1: Ligne 1:
-{{tag>​console shell BROUILLON}}+{{tag>Xenial ​console shell BROUILLON}}
  
 ---- ----
  
-====== ​ElasticSearch ​======+====== ​Elasticsearch ​======
  
-**[[https://​fr.wikipedia.org/​wiki/​Elasticsearch|ElasticSearch]] ** est une base de données documentaire libre se basant sur le serveur Apache [[https://​fr.wikipedia.org/​wiki/​Lucene|Lucene]]. Les requêtes se font via le protocole [[https://​fr.wikipedia.org/​wiki/​Hypertext_Transfer_Protocol|HTTP]] et l'​interface [[https://​fr.wikipedia.org/​wiki/​Representational_state_transfer|REST]]. ​Le 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 [[https://​fr.wikipedia.org/​wiki/​JavaScript_Object_Notation|JSON]].+**[[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]].
  
-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. Pour obtenir des informations plus poussées, veuillez vous référer aux liens en fin de pages ou chercher des sites plus spécialisés.+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.\\ 
 +Pour obtenir des informations plus poussées, veuillez vous référer aux [[#Voir aussi|liens en fin de page]] ​ou chercher des sites plus spécialisés.
  
-<note important>​La version d'​Ubuntu utilisée pour l'​exemple est la 16.04. Peut-être faut-il adapter certaines commandes ou scripts pour d'​autres versions.</​note>​ +<note important>​La version d'​Ubuntu utilisée pour l'​exemple est la [[:16.04]]. Selon votre [[:versions|version]], peut-être faudra-t-il adapter certaines ​commandes ou scripts.</​note>​
-<note >Pour réaliser ce tutoriel, mieux veut connaitre les bases de : +
-  * L'​installation de paquets : [[apt-get|apt-get]] +
-  * La modification de fichiers de paramètres : [[nano|nano]] +
-  * L'​utilisation des services ​[[creer_un_service_avec_systemd|Créer un nouveau service avec Systemd]] et [[script_sysv|Les scripts d'​initialisation système V]] +
-  * Requetage HTTP : [[http://​www.zem.fr/​curl-15-commandes-pratiques-avec-curl/​|Tuturiel FR]] ou  ​[[http://​www.slashroot.in/​curl-command-tutorial-linux-example-usage/​|Tuturiel EN]] +
-</​note>​+
  
-=====Installation=====+===== Pré-requis ​=====
  
-[[:​tutoriel:​comment_installer_un_paquet|Installez le paquet]] **[[apt://elasticsearch|elasticsearch]]**.+Pour réaliser ce tutoriel, mieux veut connaitre les bases de : 
 +  * 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'​administration]] qui peuvent être nécessaire. 
 +  ​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]]
  
-====En mode console====+=====Installation=====
  
-<code bash>​sudo ​apt-get install elasticsearch</​code+[[:​tutoriel:​comment_installer_un_paquet|Installez le paquet]] **[[apt>elasticsearch|elasticsearch]]**. 
-Pour vérifier ​que le service est installé, rechercher le via :+ 
 +Vérifier ​que le service est installé ​en saisissant depuis un [[:​terminal]] la [[:​commande_shell|commande]] suivante:
 <code bash>​service --status-all</​code>​ <code bash>​service --status-all</​code>​
 Vous devriez voir une ligne **elasticsearch** : Vous devriez voir une ligne **elasticsearch** :
 <code bash> [ - ]  elasticsearch</​code>​ <code bash> [ - ]  elasticsearch</​code>​
  
-====Script ​de lancement==== +===== Utilisation du service ===== 
-<note warning>Sur la version 16.04 d'​Ubuntu,​ le script de lancement par défaut est bogué. Il faut donc le corriger.+ 
 +Si vous êtes sur Ubuntu [[:​16.04|Xenial]] vous devez avant tout corriger le [[#​problème du script ​de lancement ​du service]] pour pouvoir utiliser ce dernier comme expliqué [[#​Utilisation|plus loin]].  
 + 
 +FIXME Après 16.04 c'est réglé ou c'est 16.04 et Supérieur qu'il faut indiquer? Lien vers un bug? 
 + 
 +==== Problème du script de lancement du service ==== 
 + 
 +Sur la version ​[[:16.04]] d'​Ubuntu,​ le script de lancement par défaut est **bogué**. Il faut donc le corriger.
  
 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 la commande de lancement a été exécutée mais que l'on est pas sur du status ​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 41: Ligne 50:
  
 sept. 18 12:57:38 lubuntu-DEV systemd[1]: Starting LSB: Starts elasticsearch... sept. 18 12:57:38 lubuntu-DEV systemd[1]: Starting LSB: Starts elasticsearch...
-sept. 18 12:57:38 lubuntu-DEV systemd[1]: Started LSB: Starts elasticsearch</​code></​note>+sept. 18 12:57:38 lubuntu-DEV systemd[1]: Started LSB: Starts elasticsearch</​code>​
  
-Pour remédier à cela, il faut modifier le script ​"​init.d"​ : +Pour remédier à cela, avec les [[:​sudo|droits d'​adminisration]] ​il faut [[:​tutoriel:​comment_modifier_un_fichier|modifier]] le script ​**/​etc/​init.d/​elasticsearch**\\
-<code bash>​sudo nano /​etc/​init.d/​elasticsearch</​code>​+
  
 D'​abord,​ trouver la ligne : D'​abord,​ trouver la ligne :
-<code bash>​test "​$START_DAEMON"​ = true || exit 0</code+<file bash>​test "​$START_DAEMON"​ = true || exit 0</file
-et la commenter : +et la commenter ​en ajoutant # au début de la ligne
-<code bash>#​test "​$START_DAEMON"​ = true || exit 0</code>+<file bash>#​test "​$START_DAEMON"​ = true || exit 0</file>
  
 Puis rechercher cette ligne : Puis rechercher cette ligne :
-<code bash>​start-stop-daemon --start -b --user "​$ES_USER"​ -c "​$ES_USER"​ --pidfile "​$PID_FILE"​ --exec $DAEMON -- $DAEMON_OPTS</​code>+<file bash>​start-stop-daemon --start -b --user "​$ES_USER"​ -c "​$ES_USER"​ --pidfile "​$PID_FILE"​ --exec $DAEMON -- $DAEMON_OPTS</​file>
 et la modifier : et la modifier :
-<code bash>​start-stop-daemon --start -b --user "​$ES_USER"​ --pidfile "​$PID_FILE"​ --exec $DAEMON -- $DAEMON_OPTS</​code>+<file bash>​start-stop-daemon --start -b --user "​$ES_USER"​ --pidfile "​$PID_FILE"​ --exec $DAEMON -- $DAEMON_OPTS</​file>
  
-<note help> A quoi servent réellement ces commandes ?+Vous devriez pouvoir désormais [[#​Utilisation|utiliser le service]] normalement.
  
-D'un côté la variable START_DAEMON n'est pas utilisée dans la suite du script. Donc pourquoi forcer l'arret du script si elle n'​existe pas ?+<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 ? 
 +  * 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>​
  
-Ensuite, le groupe défini par la variable ES_USER ne semble pas le droit de lancer le démon alors que l'​utilisateur référencer par la m^me variable lui le peut. Bizarre.</​note>​+==== Utilisation ====
  
-Maintenant le service doit pouvoir se lancer correctement. +Pour vérifier ​Maintenant le service doit pouvoir se lancer correctement. 
-Pour le vérifier, exécutez :+Pour le vérifier, exécutez ​dans un [[:​terminal]] les commandes suivantes:
 <code bash>​sudo systemctl daemon-reload <code bash>​sudo systemctl daemon-reload
 sudo service elasticsearch restart sudo service elasticsearch restart
 service elasticsearch status</​code>​ service elasticsearch status</​code>​
-Ce qui doit donner un **active (running)** qui indique la commande de lancement a été exécutée et que l'on a eu un retour positif:+FIXME pourquoi dans le bug il y a ''​sudo service elasticsearch status''​ et là pas de sudo? 
 + 
 +Ce qui doit donner un **active (running)** qui indique ​que la commande de lancement a été exécutée et qu'on a eu un retour positif :
 <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 101: Ligne 114:
   "​tagline"​ : "You Know, for Search"​   "​tagline"​ : "You Know, for Search"​
 }</​code>​ }</​code>​
-<note tip>Le port par défaut d'ElasticSearch ​est 9200</​note>​+<note tip>Le port par défaut d'Elasticsearch ​est 9200</​note>​
  
 =====Configuration===== =====Configuration=====
  
-Il reste à créer la configuration minimale pour avoir un service opérationnel. Pour cela, ouvrir ​le fichier de configuration ​+Il reste à créer la configuration minimale pour avoir un service opérationnel.\\ 
-<code bash>​sudo nano /​etc/​elasticsearch/​elasticsearch.yml</​code>​+Pour cela, avec les [[:​sudo|droits d'​adminisration]] [[:​tutoriel:​comment_modifier_un_fichier|ouvrez]] ​le fichier de configuration ​**/​etc/​elasticsearch/​elasticsearch.yml**
  
 Dans la section **Cluster**,​ choisissez un nom pour le groupe. Par exemple : Dans la section **Cluster**,​ choisissez un nom pour le groupe. Par exemple :
-<code bash>​cluster.name:​ elasticsearch</​code>+<file bash>​cluster.name:​ elasticsearch</​file>
  
 Dans la section **Node**, choisissez un nom pour le nœud. Par exemple : Dans la section **Node**, choisissez un nom pour le nœud. Par exemple :
-<code bash>​node.name:​ "​development"</​code>+<file bash>​node.name:​ "​development"</​file>
  
 Dans la section **Index**, paramétrez la répartition des données. Par exemple : Dans la section **Index**, paramétrez la répartition des données. Par exemple :
-<code bash>​index.number_of_shards:​ 1 +<file bash>​index.number_of_shards:​ 1 
-index.number_of_replicas:​ 0</code>+index.number_of_replicas:​ 0</file>
  
 Dans la section **Network And HTTP**, indiquez quelle plage du réseau est à écouter. Par exemple, pour tout écouter sans aucune restriction : Dans la section **Network And HTTP**, indiquez quelle plage du réseau est à écouter. Par exemple, pour tout écouter sans aucune restriction :
-<code bash>​network.host:​ 0.0.0.0</​code>+<file bash>​network.host:​ 0.0.0.0</​file>
  
 Il ne reste plus qu'à relancer le service : Il ne reste plus qu'à relancer le service :
Ligne 127: Ligne 140:
  
 ====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. Elle sont synthétisées sous l'​acronyme [[https://​fr.wikipedia.org/​wiki/​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 [[https://​fr.wikipedia.org/​wiki/​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
  
-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 191: Ligne 219:
 <code bash>​{"​_index":"​movies","​_type":"​movie","​_id":"​AVc-Cf49qZYpQV_XCKMq","​_version":​1,"​created":​true}</​code>​ <code bash>​{"​_index":"​movies","​_type":"​movie","​_id":"​AVc-Cf49qZYpQV_XCKMq","​_version":​1,"​created":​true}</​code>​
  
-<note important>​La méthode PUT doit **obligatoirement** avoir un ID. En effet, cette requête :+<note important>​La méthode ​''​PUT'' ​doit **obligatoirement** avoir un ID. En effet, cette requête :
 <code bash>​curl -XPUT "​http://​localhost:​9200/​movies/​movie/"​ -d' <code bash>​curl -XPUT "​http://​localhost:​9200/​movies/​movie/"​ -d'
 { {
Ligne 201: Ligne 229:
 <code bash>No handler found for uri [/​movies/​movie/​] and method [PUT]</​code></​note>​ <code bash>No handler found for uri [/​movies/​movie/​] and method [PUT]</​code></​note>​
  
-Il est possible de mettre à jour un enregistrement existant. Il faut alors refaire le même type de requête que pour une création, mais en utilisant un ID existant.+Il est possible de mettre à jour un enregistrement existant. Il faut alors refaire le même type de requête que pour une création, mais en utilisant un ID existant.\\
 Par exemple avec PUT, on peut ajouter les genres à un film : Par exemple avec PUT, on peut ajouter les genres à un film :
 <code bash>​curl -XPUT "​http://​localhost:​9200/​movies/​movie/​1"​ -d' <code bash>​curl -XPUT "​http://​localhost:​9200/​movies/​movie/​1"​ -d'
Ligne 228: Ligne 256:
 ===Lecture sur un index=== ===Lecture sur un index===
  
-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 :+<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 : 
 +== 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 419: Ligne 452:
 ===Recherche dans un champ spécifique=== ===Recherche dans un champ spécifique===
  
-En ajoutant la balise ''​fields : <NOM DU CHAMP>'',​ il est possible d'​avoir ​tous le texte mais venant d'un champ précis.+En ajoutant la balise ''​fields : <NOM DU CHAMP>'',​ il est possible d'​avoir ​tout le texte mais venant d'un champ précis.
  
 Ainsi, pour avoir tous les titres contenant le mot "​ford"​ : Ainsi, pour avoir tous les titres contenant le mot "​ford"​ :
Ligne 463: Ligne 496:
     }     }
 }'</​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 516: Ligne 549:
  
 <​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. 
-  * **filtre** 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.
  
 Pour plus de détails : [[http://​grokbase.com/​t/​gg/​elasticsearch-fr/​132jtwtn71/​faire-un-or-diff%C3%A9rence-entre-queries-et-filter|Discussion FR]] et [[https://​stackoverflow.com/​questions/​14595988/​queries-vs-filters#​14600680|Discussion EN]]</​note>​ Pour plus de détails : [[http://​grokbase.com/​t/​gg/​elasticsearch-fr/​132jtwtn71/​faire-un-or-diff%C3%A9rence-entre-queries-et-filter|Discussion FR]] et [[https://​stackoverflow.com/​questions/​14595988/​queries-vs-filters#​14600680|Discussion EN]]</​note>​
  
-===Recherche textuelle libre===+===Mapping===
  
-.+Si l'on tente de rechercher tous les films de Francis Ford Coppola : 
 +<code bash>​curl -XPOST "​http://​localhost:​9200/​_search"​ -d' 
 +
 +    "​query":​ { 
 +        "​constant_score":​ { 
 +            "​filter":​ { 
 +                "​term":​ { "​director":​ "​Francis Ford Coppola"​ } 
 +            } 
 +        } 
 +    } 
 +}'</​code>​ 
 +Aucun résultat ne sera retourné : 
 +<code bash>​{"​took":​2,"​timed_out":​false,"​_shards":​{"​total":​1,"​successful":​1,"​failed":​0},"​hits":​{"​total":​0,"​max_score":​null,"​hits":​[]}}</​code>​
  
-<code bash></​code>​ +En effet, Elasticsearch indexe les champs en utilisant le service Apache Lucene. Lucene décompose le champ en une série de mots. Ici, on a les 3 mots "​francis",​ "​ford"​ et "​coppola"​. Le champ original "​Francis Ford Coppola"​ est conservée sous la forme d'une ''​_source''​ mais qui n'est pas indexée. Or, comme seules les données indexée sont recherchée par Elasticsearch,​ il faudrait avoir la requête : 
-=====Voir aussi=====+<code bash>curl -XPOST "​http://​localhost:​9200/​_search"​ -d' 
 +
 +    "​query":​ { 
 +        "​constant_score":​ { 
 +            "​filter":​ { 
 +                "​term":​ { "​director":​ ["​francis",​ "​ford",​ "​coppola"​] } 
 +            } 
 +        } 
 +    } 
 +}'</​code>​ 
 +Pour obtenir : 
 +<code bash>​{"​took":​1,"​timed_out":​false,"​_shards":​{"​total":​1,"​successful":​1,"​failed":​0},"​hits":​{"​total":​2,"​max_score":​1.0,"​hits":​[{"​_index":"​movies","​_type":"​movie","​_id":"​1","​_score":​1.0,"​_source":​ 
 +
 +    "​title":​ "The Godfather",​ 
 +    "​director":​ "​Francis Ford Coppola",​ 
 +    "​year":​ 1972, 
 +    "​genres":​ ["​Crime",​ "​Drama"​] 
 +}},​{"​_index":"​movies","​_type":"​movie","​_id":"​4","​_score":​1.0,"​_source":​ 
 +
 +    "​title":​ "​Apocalypse Now",​ 
 +    "​director":​ "​Francis Ford Coppola",​ 
 +    "​year":​ 1979, 
 +    "​genres":​ ["​Drama",​ "​War"​] 
 +}}]}}</​code>​
  
-====En français====+<note important>​Il est possible de modifier un index existant via l'​utilisation jointe de : 
 +  * La méthode ''​POST''​ 
 +  * Le mot clé''​_mapping''​ une nouvelle forme d'​indexation 
 +  * Le champ à réindexer 
 +  * Le pararamètre ''​not_analyzed''​ : pour indiquer une champ source
  
-  * **(fr)** [[https://fr.wikipedia.org/wiki/Elasticsearch]] +Ainsi, pour les directeurs de film, on aura : 
-  * **(fr)** [[https://​fr.wikipedia.org/​wiki/​Lucene]] +<code bash>​curl -XPUT "http://localhost:​9200/movies/movie/​_mapping"​ -d' 
-  * **(fr)** ​[[https://​fr.wikipedia.org/​wiki/​Representational_state_transfer]] +
-  * **(fr)** ​[[https://​fr.wikipedia.org/​wiki/​Hypertext_Transfer_Protocol]] +   "​movie"​
-  * **(fr)** [[https://fr.wikipedia.org/​wiki/​JavaScript_Object_Notation]]+      "​properties":​ { 
 +         "​director":​ { 
 +            "​type":​ "​string",​ 
 +            "​index":​ "​not_analyzed"​ 
 +        } 
 +      } 
 +   } 
 +}'</code> 
 +Toutefois, Elasticsearch supporte mal la modification des indexes créés par défaut : 
 +<code bash>​{"​error":"​MergeMappingException[Merge failed with failures {[mapper ​[directorhas different index values, mapper [directorhas different tokenize values, mapper ​[directorhas different index_analyzer]}]","​status":​400} 
 +# new mapping creation<​/code><​/note>
  
-====En anglais=====+Il vaut mieux étendre l'​index existant. Pour cela, on va utiliser : 
 +  * Un ''​type''​ d'​extension (ici multi-field) 
 +  * Une extension de nom pour l'​index (ici ''​original''​) 
 +Ce qui donne la commande : 
 +<code bash>​curl -XPOST "​http://​localhost:​9200/​movies/​movie/​_mapping"​ -d' 
 +
 +   "​movie":​ { 
 +      "​properties":​ { 
 +         "​director":​ { 
 +            "​type":​ "​multi_field",​ 
 +            "​fields":​ { 
 +                "​director":​ {"​type":​ "​string"​},​ 
 +                "​original":​ {"​type"​ : "​string",​ "​index"​ : "​not_analyzed"​} 
 +            } 
 +         } 
 +      } 
 +   } 
 +}' 
 +</​code>​ 
 +On peut vérifier que l'​exécution est faite sans erreur : 
 +<code bash>​{"​acknowledged":​true}</​code>​
  
-  * **(en)** [[https://en.wikipedia.org/wiki/​Elasticsearch]] +Ce qui permet de réécrire finalement la requête voulue : 
-  * **(en)** [[https://www.elastic.co/]] +<code bash>​curl -XPOST "http://localhost:​9200/_search"​ -d' 
-  * **(en)** ​[[https://www.digitalocean.com/​community/​tutorials/​how-to-install-and-configure-elasticsearch-on-ubuntu-16-04]] +
-  * **(en)** ​[[http://​joelabrahamsson.com/​elasticsearch-101/​]]+    "​query"​
 +        "​constant_score":​ { 
 +            "​filter":​ { 
 +                "​term":​ { "​director.original":​ "​Francis Ford Coppola"​ } 
 +            } 
 +        } 
 +    } 
 +}'</code> 
 +Qui va renvoyer le bon résultat : 
 +<code bash>​{"​took":​1,"​timed_out":​false,"​_shards":​{"​total":​1,"​successful":​1,"​failed":​0},"​hits":​{"​total":​2,"​max_score":​1.0,"​hits":​[{"​_index"​:"​movies","​_type":"​movie","​_id":"​1","​_score":​1.0,"​_source":​ 
 +
 +    "​title":​ "The Godfather",​ 
 +    "​director":​ "​Francis Ford Coppola",​ 
 +    "​year":​ 1972, 
 +    "​genres": ​["​Crime",​ "​Drama"​] 
 +}},​{"​_index"​:"​movies","​_type":"​movie","​_id":"​4","​_score":​1.0,"​_source":​ 
 +
 +    "​title":​ "​Apocalypse Now",​ 
 +    "​director":​ "​Francis Ford Coppola",​ 
 +    "​year":​ 1979, 
 +    "​genres":​ ["​Drama",​ "​War"​] 
 +}}]}}</​code>​
  
 +=====Voir aussi=====
 +
 +  * [[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://​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>​
 +
 +----
 +//​Contributeurs:​ demi-boulet,​ [[:​utilisateurs/​bcag2]]//​
  • elasticsearch.1474652470.txt.gz
  • Dernière modification: Le 23/09/2016, 19:41
  • par demi-boulet