Elasticsearch - Consultar DSL

No Elasticsearch, a pesquisa é realizada por meio de consulta baseada em JSON. Uma consulta é composta por duas cláusulas -

  • Leaf Query Clauses - Essas cláusulas são correspondência, termo ou intervalo, que procuram um valor específico em um campo específico.

  • Compound Query Clauses - Essas consultas são uma combinação de cláusulas de consulta folha e outras consultas compostas para extrair as informações desejadas.

Elasticsearch oferece suporte a um grande número de consultas. Uma consulta começa com uma palavra-chave de consulta e, em seguida, tem condições e filtros dentro da forma de objeto JSON. Os diferentes tipos de consultas foram descritos a seguir.

Corresponder a todas as consultas

Esta é a consulta mais básica; retorna todo o conteúdo e com pontuação de 1,0 para cada objeto.

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

Ao executar o código acima, obtemos o seguinte resultado -

{
   "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"
            }
         }
      ]
   }
}

Consultas de texto completo

Essas consultas são usadas para pesquisar um corpo de texto completo, como um capítulo ou um artigo de notícias. Esta consulta funciona de acordo com o analisador associado a esse índice ou documento específico. Nesta seção, discutiremos os diferentes tipos de consultas de texto completo.

Consulta de correspondência

Esta consulta combina um texto ou frase com os valores de um ou mais campos.

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

Ao executar o código acima, obtemos a resposta conforme mostrado abaixo -

{
   "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"
            }
         }
      ]
   }
}

Consulta Multi Match

Esta consulta corresponde a um texto ou frase com mais de um campo.

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

Ao executar o código acima, obtemos a resposta conforme mostrado abaixo -

{
   "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"
            }
         }
      ]
   }
}

Query String Query

Esta consulta usa o analisador de consulta e a palavra-chave query_string.

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

Ao executar o código acima, obtemos a resposta conforme mostrado abaixo -

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

Consultas de nível de termo

Essas consultas lidam principalmente com dados estruturados como números, datas e enumerações.

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

Ao executar o código acima, obtemos a resposta conforme mostrado abaixo -

……………………………..
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
         ],
      }
   }
]   
…………………………………………..

Consulta de intervalo

Esta consulta é usada para encontrar os objetos que possuem valores entre os intervalos de valores fornecidos. Para isso, precisamos usar operadores como -

  • gte - maior que igual a
  • gt - maior que
  • lte - menor que igual a
  • lt - menos que

Por exemplo, observe o código fornecido abaixo -

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

Ao executar o código acima, obtemos a resposta conforme mostrado abaixo -

{
   "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"
            }
         }
      ]
   }
}

Existem outros tipos de consultas de nível de termo, como -

  • Exists query - Se um determinado campo possui valor não nulo.

  • Missing query - Isso é completamente oposto à consulta existente, esta consulta procura por objetos sem campos específicos ou campos com valor nulo.

  • Wildcard or regexp query - Esta consulta usa expressões regulares para encontrar padrões nos objetos.

Consultas compostas

Essas consultas são uma coleção de consultas diferentes mescladas entre si usando operadores booleanos como e, ou, não ou para índices diferentes ou tendo chamadas de função etc.

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

Ao executar o código acima, obtemos a resposta conforme mostrado abaixo -

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

Consultas geográficas

Essas consultas lidam com localizações geográficas e pontos geográficos. Essas consultas ajudam a descobrir escolas ou qualquer outro objeto geográfico próximo a qualquer local. Você precisa usar o tipo de dados de ponto geográfico.

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

Ao executar o código acima, obtemos a resposta conforme mostrado abaixo -

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

Agora postamos os dados no índice criado acima.

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

Ao executar o código acima, obtemos a resposta conforme mostrado abaixo -

{
   "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
               ]
            }
         }
      }
   }