Elasticsearch - Requête DSL

Dans Elasticsearch, la recherche est effectuée à l'aide d'une requête basée sur JSON. Une requête est composée de deux clauses -

  • Leaf Query Clauses - Ces clauses sont des correspondances, des termes ou des plages, qui recherchent une valeur spécifique dans un champ spécifique.

  • Compound Query Clauses - Ces requêtes sont une combinaison de clauses de requête feuille et d'autres requêtes composées pour extraire les informations souhaitées.

Elasticsearch prend en charge un grand nombre de requêtes. Une requête commence par un mot clé de requête, puis contient des conditions et des filtres sous la forme d'un objet JSON. Les différents types de requêtes ont été décrits ci-dessous.

Faire correspondre toutes les requêtes

C'est la requête la plus basique; il renvoie tout le contenu et avec le score de 1,0 pour chaque objet.

POST /schools/_search
{
   "query":{
      "match_all":{}
   }
}

En exécutant le code ci-dessus, nous obtenons le résultat suivant -

{
   "took" : 7,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 2,
         "relation" : "eq"
      },
      "max_score" : 1.0,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "5",
            "_score" : 1.0,
            "_source" : {
               "name" : "Central School",
               "description" : "CBSE Affiliation",
               "street" : "Nagan",
               "city" : "paprola",
               "state" : "HP",
               "zip" : "176115",
               "location" : [
                  31.8955385,
                  76.8380405
               ],
               "fees" : 2200,
               "tags" : [
                  "Senior Secondary",
                  "beautiful campus"
               ],
               "rating" : "3.3"
            }
         },
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "4",
            "_score" : 1.0,
            "_source" : {
               "name" : "City Best School",
               "description" : "ICSE",
               "street" : "West End",
               "city" : "Meerut",
               "state" : "UP",
               "zip" : "250002",
               "location" : [
                  28.9926174,
                  77.692485
               ],
               "fees" : 3500,
               "tags" : [
                  "fully computerized"
               ],
               "rating" : "4.5"
            }
         }
      ]
   }
}

Requêtes en texte intégral

Ces requêtes sont utilisées pour rechercher un corps de texte complet comme un chapitre ou un article de presse. Cette requête fonctionne en fonction de l'analyseur associé à cet index ou document particulier. Dans cette section, nous aborderons les différents types de requêtes de texte intégral.

Requête de correspondance

Cette requête met en correspondance un texte ou une expression avec les valeurs d'un ou plusieurs champs.

POST /schools*/_search
{
   "query":{
      "match" : {
         "rating":"4.5"
      }
   }
}

En exécutant le code ci-dessus, nous obtenons la réponse comme indiqué ci-dessous -

{
   "took" : 44,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 1,
         "relation" : "eq"
      },
      "max_score" : 0.47000363,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "4",
            "_score" : 0.47000363,
            "_source" : {
               "name" : "City Best School",
               "description" : "ICSE",
               "street" : "West End",
               "city" : "Meerut",
               "state" : "UP",
               "zip" : "250002",
               "location" : [
                  28.9926174,
                  77.692485
               ],
               "fees" : 3500,
               "tags" : [
                  "fully computerized"
               ],
               "rating" : "4.5"
            }
         }
      ]
   }
}

Requête multi-correspondance

Cette requête correspond à un texte ou une phrase avec plusieurs champs.

POST /schools*/_search
{
   "query":{
      "multi_match" : {
         "query": "paprola",
         "fields": [ "city", "state" ]
      }
   }
}

En exécutant le code ci-dessus, nous obtenons la réponse comme indiqué ci-dessous -

{
   "took" : 12,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 1,
         "relation" : "eq"
      },
      "max_score" : 0.9808292,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "5",
            "_score" : 0.9808292,
            "_source" : {
               "name" : "Central School",
               "description" : "CBSE Affiliation",
               "street" : "Nagan",
               "city" : "paprola",
               "state" : "HP",
               "zip" : "176115",
               "location" : [
                  31.8955385,
                  76.8380405
               ],
               "fees" : 2200,
               "tags" : [
                  "Senior Secondary",
                  "beautiful campus"
               ],
               "rating" : "3.3"
            }
         }
      ]
   }
}

Requête Requête de chaîne

Cette requête utilise un analyseur de requête et un mot clé query_string.

POST /schools*/_search
{
   "query":{
      "query_string":{
         "query":"beautiful"
      }
   }
}

En exécutant le code ci-dessus, nous obtenons la réponse comme indiqué ci-dessous -

{
   "took" : 60,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
      "value" : 1,
      "relation" : "eq"
   },
………………………………….

Requêtes au niveau du terme

Ces requêtes traitent principalement de données structurées telles que des nombres, des dates et des énumérations.

POST /schools*/_search
{
   "query":{
      "term":{"zip":"176115"}
   }
}

En exécutant le code ci-dessus, nous obtenons la réponse comme indiqué ci-dessous -

……………………………..
hits" : [
   {
      "_index" : "schools",
      "_type" : "school",
      "_id" : "5",
      "_score" : 0.9808292,
      "_source" : {
         "name" : "Central School",
         "description" : "CBSE Affiliation",
         "street" : "Nagan",
         "city" : "paprola",
         "state" : "HP",
         "zip" : "176115",
         "location" : [
            31.8955385,
            76.8380405
         ],
      }
   }
]   
…………………………………………..

Requête de plage

Cette requête est utilisée pour trouver les objets ayant des valeurs entre les plages de valeurs données. Pour cela, nous devons utiliser des opérateurs tels que -

  • gte - supérieur à égal à
  • gt - supérieur à
  • lte - inférieur à égal à
  • lt - moins de

Par exemple, observez le code ci-dessous -

POST /schools*/_search
{
   "query":{
      "range":{
         "rating":{
            "gte":3.5
         }
      }
   }
}

En exécutant le code ci-dessus, nous obtenons la réponse comme indiqué ci-dessous -

{
   "took" : 24,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 1,
         "relation" : "eq"
      },
      "max_score" : 1.0,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "4",
            "_score" : 1.0,
            "_source" : {
               "name" : "City Best School",
               "description" : "ICSE",
               "street" : "West End",
               "city" : "Meerut",
               "state" : "UP",
               "zip" : "250002",
               "location" : [
                  28.9926174,
                  77.692485
               ],
               "fees" : 3500,
               "tags" : [
                  "fully computerized"
               ],
               "rating" : "4.5"
            }
         }
      ]
   }
}

Il existe d'autres types de requêtes au niveau du terme, telles que -

  • Exists query - Si un certain champ a une valeur non nulle.

  • Missing query - Ceci est complètement opposé à la requête existe, cette requête recherche des objets sans champs spécifiques ou des champs ayant une valeur nulle.

  • Wildcard or regexp query - Cette requête utilise des expressions régulières pour rechercher des modèles dans les objets.

Requêtes composées

Ces requêtes sont une collection de différentes requêtes fusionnées les unes avec les autres à l'aide d'opérateurs booléens tels que et, ou, pas ou pour différents index ou ayant des appels de fonction, etc.

POST /schools/_search
{
   "query": {
      "bool" : {
         "must" : {
            "term" : { "state" : "UP" }
         },
         "filter": {
            "term" : { "fees" : "2200" }
         },
         "minimum_should_match" : 1,
         "boost" : 1.0
      }
   }
}

En exécutant le code ci-dessus, nous obtenons la réponse comme indiqué ci-dessous -

{
   "took" : 6,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 0,
         "relation" : "eq"
      },
      "max_score" : null,
      "hits" : [ ]
   }
}

Requêtes géographiques

Ces requêtes concernent les emplacements géographiques et les points géographiques. Ces requêtes aident à trouver des écoles ou tout autre objet géographique à proximité de n'importe quel endroit. Vous devez utiliser le type de données de point géographique.

PUT /geo_example
{
   "mappings": {
      "properties": {
         "location": {
            "type": "geo_shape"
         }
      }
   }
}

En exécutant le code ci-dessus, nous obtenons la réponse comme indiqué ci-dessous -

{  "acknowledged" : true,
   "shards_acknowledged" : true,
   "index" : "geo_example"
}

Maintenant, nous publions les données dans l'index créé ci-dessus.

POST /geo_example/_doc?refresh
{
   "name": "Chapter One, London, UK",
   "location": {
      "type": "point",
      "coordinates": [11.660544, 57.800286]
   }
}

En exécutant le code ci-dessus, nous obtenons la réponse comme indiqué ci-dessous -

{
   "took" : 1,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 2,
         "relation" : "eq"
      },
      "max_score" : 1.0,
      "hits" : [
         "_index" : "geo_example",
         "_type" : "_doc",
         "_id" : "hASWZ2oBbkdGzVfiXHKD",
         "_score" : 1.0,
         "_source" : {
            "name" : "Chapter One, London, UK",
            "location" : {
               "type" : "point",
               "coordinates" : [
                  11.660544,
                  57.800286
               ]
            }
         }
      }
   }