Plan du site  
pixel
pixel

Articles - Étudiants SUPINFO

ElasticSearch

Par Florian MASCARO Publié le 02/06/2016 à 20:11:36 Noter cet article:
(0 votes)
Avis favorable du comité de lecture

Introduction

ElasticSearch est un moteur de recherche open source. Il est interrogeable directement via une API REST et propose toutes les fonctionnalités d’un moteur de recherche dernière génération.

L'utilisation de ce moteur de recherche peut très vite devenir complexe. C'est pourquoi nous verrons dans cet article l'installation et l'utilisation de ce moteur de recherche à l'aide d'exemples.

Installation

Pour lancer le script de lancement (elasticsearch.bat pour Windows ou elasticsearch pour Linux), il faut la présence de Java 6 minimum sur la machine. Pour télécharger et démarrer ElasticSearch sur une machine Linux, vous pouvez exécuter les commandes suivantes :

wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.3.3/elasticsearch-2.3.3.tar.gz
tar -zxvf elasticsearch-2.3.3.tar.gz
cd elasticsearch-2.3.3
bin/elasticsearch 

Vous devriez voir les lignes suivantes :

[2016-06-02 18:15:17,102][WARN ][bootstrap                ] jvm uses the client vm, make sure to run `java` with the server vm for best performance by adding `-server` to the command line
[2016-06-02 18:15:18,805][INFO ][node                     ] [Ororo Munroe] version[2.3.3], pid[4452], build[218bdf1/2016-05-17T15:40:04Z]
[2016-06-02 18:15:18,820][INFO ][node                     ] [Ororo Munroe] initializing ...
[2016-06-02 18:15:21,511][INFO ][plugins                  ] [Ororo Munroe] modules [reindex, lang-expression, lang-groovy], plugins [], sites []
[2016-06-02 18:15:21,627][INFO ][env                      ] [Ororo Munroe] using [1] data paths, mounts [[OS (C:)]], net usable_space [5.5gb], net total_space [28.4gb], spins? [unknown], types [NTFS]
[2016-06-02 18:15:21,658][INFO ][env                      ] [Ororo Munroe] heap size [989.8mb], compressed ordinary object pointers [unknown]
[2016-06-02 18:15:29,696][INFO ][node                     ] [Ororo Munroe] initialized
[2016-06-02 18:15:29,696][INFO ][node                     ] [Ororo Munroe] starting ...
[2016-06-02 18:15:30,924][INFO ][transport                ] [Ororo Munroe] publish_address {127.0.0.1:9300}, bound_addresses {127.0.0.1:9300}, {[::1]:9300}
[2016-06-02 18:15:30,938][INFO ][discovery                ] [Ororo Munroe] elasticsearch/g4v6NonYR2OLcSV5crmUjg
[2016-06-02 18:15:35,223][INFO ][cluster.service          ] [Ororo Munroe] new_master {Ororo Munroe}{g4v6NonYR2OLcSV5crmUjg}{127.0.0.1}{127.0.0.1:9300}, reason: zen-disco-join(elected_as_master, [0] joins received)
[2016-06-02 18:15:35,376][INFO ][gateway                  ] [Ororo Munroe] recovered [0] indices into cluster_state
[2016-06-02 18:15:36,278][INFO ][http                     ] [Ororo Munroe] publish_address {127.0.0.1:9200}, bound_addresses {127.0.0.1:9200}, {[::1]:9200}
[2016-06-02 18:15:36,278][INFO ][node                     ] [Ororo Munroe] started

ElasticSearch est maintenant démarré. Vous pouvez y accéder via l'url http://localhost:9200 depuis votre navigateur. Vous devriez avoir le retour suivant :

    {
        "name": "Ororo Munroe",
        "cluster_name": "elasticsearch",
        "version":
        {
            "number": "2.3.3",
            "build_hash": "218bdf10790eef486ff2c41a3df5cfa32dadcfde",
            "build_timestamp": "2016-05-17T15:40:04Z",
            "build_snapshot": false,
            "lucene_version": "5.5.0"
        },
        "tagline": "You Know, for Search"
    }

L'API

ElasticSearch propose une API REST permettant de réaliser tous types d’opérations. Cette API utilise le format JSON pour les requêtes et les réponses et supporte les principales méthodes HTTP (GET, DELETE, PUT et POST).

Elle est utilisée de la façon suivante :

http://host:port/[index]/[type]/[_action|id] 1 http://host:port/[index]/[type]/[_action|id] 
  • index : Nom de l’index sur lequel porte l’opération

  • type : Nom du type de document

  • _action : Nom de l’action à effectuer

  • id : Identifiant du document

Indexer des documents

Voici un exemple d’indexation d’un document de type user dans un index nommé site, puis l'ajout d'un document de type article :

curl -XPUT 'http://localhost:9200/site/user/dupont' -d '{ "name" : "George Dupont" }'

curl -XPUT 'http://localhost:9200/site/article/1' -d '
{
    "user": "dupont",
    "postDate": "2016-06-02",
    "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." ,
    "title": "Lorem ipsum"
}'

Vous devriez avoir une réponse indiquant que l'indexation s'est correctement passé, avec un rappel de l'index, du type et de l'identifiant.

    {
        "_index": "site",
        "_type": "user",
        "_id": "dupont",
        "_version": 1,
        "_shards":
        {
            "total": 2,
            "successful": 1,
            "failed": 0
        },
        "created": true
    }

Rechercher un document

Afin de rechercher avec ElasticSearch, nous utilisons le point de terminaison _search, éventuellement avec un index et le type. Autrement dit, nous faisons des demandes à une URL suivant ce modèle: <index> / <Type> / _search où l'indice et le type sont tous deux en option.

Par exemple, pour rechercher un article, nous pouvons faire des requêtes POST à l'une des adresses suivantes :

http://localhost:9200/_search - Recherche dans tous les index et tous les types.

http://localhost: 9200/site/_search - Rechercher dans tous les types de l'index 'site'

http://localhost:9200/site/article/_search - Rechercher explicitement pour les documents de type article au sein de l'index 'site'.

Récupération avec l'id

La récupération d'un document est simple si vous connaissez l'emplacement de ce dernier.

    curl -XGET 'http://localhost:9200/site/user/dupont'

    Réponse :

    {
        "_index": "site",
        "_type": "user",
        "_id": "dupont",
        "_version": 1,
        "found": true,
        "_source":
        {
            "name": "George Dupont"
        }
    }

Recherche simple

Pour récupérer un document à l'aide d'un mot-clé, vous pouvez utilisez la syntaxe suivante :

    curl -XGET 'http://localhost:9200/site/user/_search?q=george'   

Cette syntaxe permet de mettre les mots-clés directement dans le paramètre 'q' de l'URL. ElasticSearch renverra la liste des documents correspondants aux résultats de la recherche :

     {
        "took": 200,
        "timed_out": false,
        "_shards":
        {
            "total": 5,
            "successful": 5,
            "failed": 0
        },
        "hits":
        {
            "total": 1,
            "max_score": 0.19178301,
            "hits":
            [
                {
                    "_index": "site",
                    "_type": "user",
                    "_id": "dupont",
                    "_score": 0.19178301,
                    "_source":
                    {
                        "name": "George Dupont"
                    }
                }
            ]
        }
    }

Il est aussi possible d'indiquer le nom du champ dans lequel nous voulons rechercher. Par exemple, pour récupérer la liste des articles dont le titre contient le mot 'lorem' :

    curl -XGET 'http://localhost:9200/site/article/_search?q=title:lorem*'   

Les requêtes

Les requêtes sont des objets JSON avec la structure suivante :

curl -XPOST http://localhost:9200/site/article/_search -d '{
        size: # Le nombre de résultats à retourner. Par défaut, cette valeur est de 10
        from: # L'offset (0 par défaut)
        fields: # La liste des champs à retourner - http://elasticsearch.org/guide/reference/api/search/fields.html
        sort: # L'ordre de tri - see http://elasticsearch.org/guide/reference/api/search/sort.html

        query: {
            # Les arguments de recherche : http://elasticsearch.org/guide/reference/query-dsl/
            
        },

        # La mise en place de filtre sur les résultats
        filter: {
            # Les arguments de filtrage
        },
    }
  

Exemples de syntaxe JSON

Récupération de tous les documents

{
    "query": {
        "match_all": {}
    }
}

Requête de style Full-text dans tous les champs.

{
    "query": {
        "query_string": {
            "query": {query string}
        }
    }
}

Recherche dans un seul champ

{
    "query": {
        "term": {
            {field-name}: {value}
        }
    }
}

Utilisation des filtres :

{
    "query": {
        "constant_score": {
            "filter": {
                "term": {
                    # note that value should be *lower-cased*
                    {field-name}: {value}
                }
            }
        }
}

Trouver tous les documents ayant une valeur dans une plage. Cela peut être utilisé aussi bien pour des plages de texte (par exemple, A à Z), plages numériques (10-20) et pour les dates (ElasticSearch convertit les dates au format ISO 8601).

{
    "query": {
        "constant_score": {
            "filter": {
                "range": {
                    {field-name}: {
                        "from": {lower-value}
                        "to": {upper-value}
                    }
                }
            }
        }
    }
}

Filtrage sur deux champs. Notez que vous ne pouvez pas, malheureusement, faire une requête simple en ajoutant deux filtres à l'intérieur de l'élément de requête. Au lieu de cela vous avez besoin d'un "AND" dans un filtre. Vous pouvez également obtenir le même résultat ici en utilisant une requête booléenne.

{
    "query": {
        "filtered": {
            "query": {
                "match_all": {}
            },
            "filter": {
                "and": [
                    {
                        "range" : {
                            "b" : { 
                                "from" : 4, 
                                "to" : "8"
                            }
                        },
                    },
                    {
                        "term": {
                            "a": "john"
                        }
                    }
                ]
            }
        }
    }
}

Supprimer des documents

Pour supprimer un seul document à partir de l'index avec l'ID, nous utilisons la même URL que pour l'indexation, mais cette fois nous changeons la méthode HTTP pour DELETE.

curl -XDELETE 'http://localhost:9200/site/user/dupont' -d ''

Vous devriez avoir une réponse indiquant le résultat de la suppression :

    {
        "found": true,
        "_index": "site",
        "_type": "user",
        "_id": "dupont",
        "_version": 2,
        "_shards":
        {
            "total": 2,
            "successful": 1,
            "failed": 0
        }
    }

Conclusion

Comme nous avons pu le voir, la recherche via ElasticSearch permet d'avoir des résultats pertinents et assez rapide. De plus, la mise en place d'une solution de clustering se fait rapidement et facilement, ce qui est un des atouts d'ElasticSearch.

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