Elasticsearch - Indexation et recherches simples

Recherche

DéfinitionRecherches avec une query DSL

Le query DSL Domain Specific Language) permet d'exprimer des définitions complexes de requêtes.

Il existe deux types de query DSL :

  • Requêtes :

    • Le résultat dépend d'un score attribué aux documents

    • Répond à la question : À quel point ce document correspond-il à cette clause de requête ? Score

  • Filtres :

    • Pas de manipulation de score

    • Répond à la question : Ce document correspond-il à cette clause de requête ? Oui / Non

La même recherche que dans l'exemple précédant, sous forme DSL, permettant de retourner tous les documents :

1
POST http://localhost:9200/biblio/_search
2
{
3
  "query": { "match_all": {} }
4
}

MéthodeParamètres de recherche

En plus de la query, on peut passer d'autres paramètres dans le corps de la requête, notamment pour faire de la pagination. Par exemple, la requête suivante retournera uniquement le premier résultat. Le paramètre par défaut de size est 10.

1
POST http://localhost:9200/biblio/_search
2
{
3
  "query": { "match_all": {} },
4
  "size": 1
5
}

Celle-ci retournera les documents 11 à 20. Par défaut, la valeur du paramètre from est 0.

1
POST http://localhost:9200/biblio/_search
2
{
3
  "query": { "match_all": {} },
4
  "from": 10,
5
  "size": 10
6
}

Le paramètre _source permet de définir quels sont les champs qui doivent être retournés. La requête suivante retournera uniquement l'auteur et le titre du livre :

1
POST http://localhost:9200/biblio/_search
2
{
3
  "query": { "match_all": {} },
4
  "_source": ["titre", "auteur"]
5
}

Pour certaines recherche il peut être intéressant d'ajouter un tri. On utilise le mot clé sort pour en définir les critères. Il est possible d'utiliser des tris simples (alphabétique), ou dépendants du type de donnée (par date ou par distance kilométrique en sont deux exemples). Deux champs spécifiques permettent d’accéder à des métadonnées, _score permet d'ordonner par les score (comportement par défaut), _doc permet de trier selon leur index. Il est possible de combiner les critère de tri, comme dans l'exemple suivant :

1
POST http://localhost:9200/biblio/livres/_search
2
{
3
  "query": {"match_all": {}  },
4
   "sort" : [
5
          { "pages" : "desc" },
6
        "auteur",
7
        "_doc"
8
    ]
9
}

MéthodeConstruction d'une requête

Nous avons déjà vu comment faire pour récupérer tous les documents. Pour effectuer une recherche sur un champ spécifique, on peut utiliser le mot clé match. La requête suivante permet de récupérer tous les document dont l’auteur est Stephen King :

1
POST http://localhost:9200/biblio/_search
2
{
3
  "query": { "match": { "auteur": "Stephen King" } }
4
}

Par défaut chaque mot séparé par un espace sera traité comme un OR. Elasticsearch classe les résultat par leur score, qui défini leur pertinence. C'est donc pour cela que lors de la recherche sur Stephen King, on peut trouver d'autres auteurs comme Stephen Covey. Étant donné qu'un seul mot sur les deux correspond, leur score est moins bon et se trouve à la fin des résultats.

Pour traiter une phrase entière comme un ensemble, il faut utiliser match_phrase

1
POST http://localhost:9200/biblio/_search
2
{
3
  "query": { "match_phrase": { "auteur": "Stephen King" } }
4
}

Pour combiner plusieurs contraintes, on peut utiliser le type de requête bool. Celle-ci permet de combiner différentes clauses avec des AND (must), OR (should) et de AND NOT (must_not). La requête suivante permet de récupérer les documents écrit par Stephen King de genre fantastique sauf le livre Shining :

1
POST http://localhost:9200/biblio/livres/_search
2
{
3
  "query": {
4
    "bool": {
5
      "must": [
6
        { "match": { "auteur": "Stephen King" }},
7
        { "match": { "genre": "fantastique" }}
8
      ],
9
      "must_not": [
10
        { "match": { "titre": "Shining" } }
11
]}}}

Il est possible de faire une recherche sur tous les champs d'un document en substituant le nom du champs par _all.

MéthodeFiltre

On peut ajouter un filtre sur nos critères pour restreindre la recherche : les clauses inclues dans le filtre n'influent pas sur le score, mais éliminent directement les documents inutiles.

Par exemple, pour effectuer une recherche parmi les livres d'au moins 2000 pages :

1
POST http://localhost:9200/biblio/livres/_search
2
{
3
  "query": {
4
    "bool": {
5
      "must": [
6
        { "match": { "auteur": "Stephen King" }},
7
        { "match": { "genre": "fantastique" }}
8
      ],
9
      "must_not": [
10
        { "match": { "titre": "Shining" } }
11
      ],
12
      "filter": {
13
        "range": {
14
          "pages": {
15
            "gt": 2000
16
}}}}}}

Parametres d'une recherche de plage :

gte   Greater-than or equal to

gt    Greater-than

lte    Less-than or equal to

lt     Less-than

Fondamental

Les clauses d'une query et d'une filtre sont interchangeables dans leur syntaxe, seule leur interprétation pour la requête change.

En plus des mots clés cités ici, il y en a de nombreux autres qui ne seront pas étudiés ici. Certains permettent d'ajouter des clauses spécifiques à un type de donnée (les dates, les coordonnées géographiques, ...), d'autres de modifier le type même de la requête (bool query, function score query, ...), d'ajouter des paramètres à la recherche, ou encore de modifier la manière dont sont analysés les mots (tolérance d'erreur). Leur comportement est similaire à ceux étudiés ici, il suffit donc de consulter la documentation dont le lien est indiqué en bas de la page.

PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimer Robin Jolliet, 2016 (Contributions : Stéphane Crozat, les étudiants de l'UTC) Paternité - Partage des Conditions Initiales à l'IdentiqueRéalisé avec Scenari (nouvelle fenêtre)