Учебники

Elasticsearch — Query DSL

В Elasticsearch поиск выполняется с использованием запросов на основе JSON. Запрос состоит из двух пунктов:

  • Предложения Leaf Query — Эти предложения представляют собой соответствие, термин или диапазон, которые ищут определенное значение в определенном поле.

  • Составные предложения запросов — эти запросы представляют собой комбинацию конечных предложений запросов и других составных запросов для извлечения требуемой информации.

Предложения Leaf Query — Эти предложения представляют собой соответствие, термин или диапазон, которые ищут определенное значение в определенном поле.

Составные предложения запросов — эти запросы представляют собой комбинацию конечных предложений запросов и других составных запросов для извлечения требуемой информации.

Elasticsearch поддерживает большое количество запросов. Запрос начинается с ключевого слова запроса, а затем содержит условия и фильтры внутри в виде объекта JSON. Различные типы запросов были описаны ниже —

Совпадение всех запросов

Это самый простой запрос; он возвращает все содержимое и со счетом 1,0 для каждого объекта. Например,

POST http://localhost:9200/schools*/_search

Тело запроса

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

отклик

{
   "took":1, "timed_out":false, "_shards":{"total":10, "successful":10, "failed":0},
   "hits":{
      "total":5, "max_score":1.0, "hits":[
         {
            "_index":"schools", "_type":"school", "_id":"2", "_score":1.0,
            "_source":{
               "name":"Saint Paul School", "description":"ICSE Affiliation",
               "street":"Dawarka", "city":"Delhi", "state":"Delhi", 
               "zip":"110075", "location":[28.5733056, 77.0122136], "fees":5000, 
               "tags":["Good Faculty", "Great Sports"], "rating":"4.5"
            }
         },
				
         {
            "_index":"schools_gov", "_type":"school", "_id":"2", "_score":1.0,
            "_source":{
               "name":"Government School", "description":"State Board Affiliation",
               "street":"Hinjewadi", "city":"Pune", "state":"MH", "zip":"411057",
               "location":[18.599752, 73.6821995], "fees":500, "tags":["Great Sports"],
               "rating":"4"
            }
         },
				
         {
            "_index":"schools", "_type":"school", "_id":"1", "_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_gov", "_type":"school", "_id":"1", "_score":1.0,
            "_source":{
               "name":"Model School", "description":"CBSE Affiliation",
               "street":"silk city", "city":"Hyderabad", "state":"AP", 
               "zip":"500030", "location":[17.3903703, 78.4752129], "fees":700, 
               "tags":["Senior Secondary", "beautiful campus"], "rating":"3"
            }
         },
				
         {
            "_index":"schools", "_type":"school", "_id":"3", "_score":1.0,
            "_source":{
               "name":"Crescent School", "description":"State Board Affiliation",
               "street":"Tonk Road", "city":"Jaipur", "state":"RJ", "zip":"176114",
               "location":[26.8535922, 75.7923988], "fees":2500, 
               "tags":["Well equipped labs"], "rating":"4.5"
            }
         }
      ]
   }
}

Полнотекстовые запросы

Эти запросы используются для поиска по всему тексту, например по главе или новостной статье. Этот запрос работает в соответствии с анализатором, связанным с этим конкретным индексом или документом. В этом разделе мы обсудим различные типы полнотекстовых запросов.

Запрос на совпадение

Этот запрос сопоставляет текст или фразу со значениями одного или нескольких полей. Например,

POST http://localhost:9200/schools*/_search

Тело запроса

{
   "query":{
      "match" : {
         "city":"pune"
      }
   }
}

отклик

{
   "took":1, "timed_out":false, "_shards":{"total":10, "successful":10, "failed":0},
   "hits":{
      "total":1, "max_score":0.30685282, "hits":[{
         "_index":"schools_gov", "_type":"school", "_id":"2", "_score":0.30685282, 
         "_source":{
            "name":"Government School", "description":"State Board Afiliation",
            "street":"Hinjewadi", "city":"Pune", "state":"MH", "zip":"411057",
            "location":[18.599752, 73.6821995], "fees":500, 
            "tags":["Great Sports"], "rating":"4"
         }
      }]
   }
}

запрос multi_match

Этот запрос соответствует тексту или фразе с более чем одним полем. Например,

POST http://localhost:9200/schools*/_search

Тело запроса

{
   "query":{
      "multi_match" : {
         "query": "hyderabad",
         "fields": [ "city", "state" ]
      }
   }
}

отклик

{
   "took":16, "timed_out":false, "_shards":{"total":10, "successful":10, "failed":0},
   "hits":{
      "total":1, "max_score":0.09415865, "hits":[{
         "_index":"schools_gov", "_type":"school", "_id":"1", "_score":0.09415865,
         "_source":{
            "name":"Model School", " description":"CBSE Affiliation", 
            "street":"silk city", "city":"Hyderabad", "state":"AP", 
            "zip":"500030", "location":[17.3903703, 78.4752129], "fees":700, 
            "tags":["Senior Secondary", "beautiful campus"], "rating":"3"
         }
      }]
   }
}

Query String Query

Этот запрос использует синтаксический анализатор запроса и ключевое слово query_string. Например,

POST http://localhost:9200/schools/_search

Тело запроса

{
   "query":{
      "query_string":{
         "query":"good faculty"
      }
   }
}

отклик

{
   "took":16, "timed_out":false, "_shards":{"total":10, "successful":10, "failed":0}, 
   "hits":{
      "total":1, "max_score":0.09492774, "hits":[{
         "_index":"schools", "_type":"school", "_id":"2", "_score":0.09492774, 
         "_source":{
            "name":"Saint Paul School", "description":"ICSE Affiliation",
            "street":"Dawarka", "city":"Delhi", "state":"Delhi",
            "zip":"110075", "location":[28.5733056, 77.0122136],
            "fees":5000, "tags":["Good Faculty", "Great Sports"],
            "rating":"4.5" 
         }
      }]
   }
}

Запросы на уровне семестра

Эти запросы в основном касаются структурированных данных, таких как числа, даты и электронные значения. Например,

POST http://localhost:9200/schools/_search

Тело запроса

{
   "query":{
      "term":{"zip":"176115"}
   }
}

отклик

{
   "took":1, "timed_out":false, "_shards":{"total":10, "successful":10, "failed":0},
   "hits":{
      "total":1, "max_score":0.30685282, "hits":[{
         "_index":"schools", "_type":"school", "_id":"1", "_score":0.30685282,
         "_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"
         }
      }]
   }
}

Range Query

Этот запрос используется для поиска объектов, имеющих значения между диапазонами значений. Для этого нам нужно использовать такие операторы, как —

  • gte — больше чем равно

  • GT — больше, чем

  • lte — меньше чем равно

  • менее чем

gte — больше чем равно

GT — больше, чем

lte — меньше чем равно

менее чем

Например,

POST http://localhost:9200/schools*/_search

Тело запроса

{
   "query":{
      "range":{
         "rating":{
            "gte":3.5
         }
      }
   }
}

отклик

{
   "took":31, "timed_out":false, "_shards":{"total":10, "successful":10, "failed":0},
   "hits":{
      "total":3, "max_score":1.0, "hits":[
         {
            "_index":"schools", "_type":"school", "_id":"2", "_score":1.0,
            "_source":{
               "name":"Saint Paul School", "description":"ICSE Affiliation",
               "street":"Dawarka", "city":"Delhi", "state":"Delhi", 
               "zip":"110075", "location":[28.5733056, 77.0122136], "fees":5000, 
               "tags":["Good Faculty", "Great Sports"], "rating":"4.5"
            }
         }, 
		
         {
            "_index":"schools_gov", "_type":"school", "_id":"2", "_score":1.0, 
            "_source":{
               "name":"Government School", "description":"State Board Affiliation",
               "street":"Hinjewadi", "city":"Pune", "state":"MH", "zip":"411057",
               "location":[18.599752, 73.6821995] "fees":500, 
               "tags":["Great Sports"], "rating":"4"
            }
         },
			
         {
            "_index":"schools", "_type":"school", "_id":"3", "_score":1.0,
            "_source":{
               "name":"Crescent School", "description":"State Board Affiliation",
               "street":"Tonk Road", "city":"Jaipur", "state":"RJ", "zip":"176114", 
               "location":[26.8535922, 75.7923988], "fees":2500,
               "tags":["Well equipped labs"], "rating":"4.5"
            }
         }
      ]
   }
}

Другие типы запросов на уровне терминов:

  • Запрос Exists — если определенное поле имеет ненулевое значение.

  • Отсутствующий запрос — это полностью противоположно существующему запросу, этот запрос ищет объекты без определенных полей или полей, имеющих нулевое значение.

  • Запрос с подстановочными знаками или регулярными выражениями — этот запрос использует регулярные выражения для поиска шаблонов в объектах.

Запрос Exists — если определенное поле имеет ненулевое значение.

Отсутствующий запрос — это полностью противоположно существующему запросу, этот запрос ищет объекты без определенных полей или полей, имеющих нулевое значение.

Запрос с подстановочными знаками или регулярными выражениями — этот запрос использует регулярные выражения для поиска шаблонов в объектах.

Тип запроса — документы с определенным типом. Например,

POST http://localhost:9200/schools*/_search

Тело запроса

{
   "query":{
      "type" : {
         "value" : "school"
      }
   }
}

отклик

Все школьные объекты JSON присутствуют в указанных индексах.

Сложные Запросы

Эти запросы представляют собой набор различных запросов, объединенных друг с другом с использованием логических операторов, таких как и, или, нет, или для разных индексов, или с помощью вызовов функций и т. Д. Например,

POST http://localhost:9200/schools*/_search

Тело запроса

{
   "query":{
      "filtered":{
         "query":{
            "match":{
               "state":"UP"
            }
         },
			
         "filter":{
            "range":{
               "rating":{
                  "gte":4.0
               }
            }
         }
      }
   }
}

отклик

{
   "took":16, "timed_out":false, "_shards":{"total":10, "successful":10, "failed":0},
   "hits":{"total":0, "max_score":null, "hits":[]}
}

Присоединение к запросам

Эти запросы используются там, где включено более одного сопоставления или документа. Существует два типа присоединяющихся запросов:

Вложенный запрос

Эти запросы имеют дело с вложенным отображением (вы узнаете об этом подробнее в следующей главе).

запросы has_child и has_parent

Эти запросы используются для получения дочернего или родительского документа, который получил совпадение в запросе. Например,

POST http://localhost:9200/tutorials/_search

Тело запроса

{
   "query":
   {
      "has_child" : {
         "type" : "article", "query" : {
            "match" : {
               "Text" : "This is article 1 of chapter 1"
            }
         }
      }
   }
}

отклик

{
   "took":21, "timed_out":false, "_shards":{"total":5, "successful":5, "failed":0},
   "hits":{
      "total":1, "max_score":1.0, "hits":[{
         "_index":"tutorials", "_type":"chapter", "_id":"1", "_score":1.0,
         "_source":{
            "Text":"this is chapter one"
         }
      }]
   }
}

Geo Queries

Эти запросы касаются географических местоположений и географических точек. Эти запросы помогают обнаружить школы или любой другой географический объект рядом с любым местоположением. Вам необходимо использовать тип данных Geo Point. Например,

POST http://localhost:9200/schools*/_search

Тело запроса

{
   "query":{
      "filtered":{
         "filter":{
            "geo_distance":{
               "distance":"100km",
               "location":[32.052098, 76.649294]
            }
         }
      }
   }
}

отклик

{
   "took":6, "timed_out":false, "_shards":{"total":10, "successful":10, "failed":0},
   "hits":{
      "total":2, "max_score":1.0, "hits":[
         {
            "_index":"schools", "_type":"school", "_id":"2", "_score":1.0,
            "_source":{
               "name":"Saint Paul School", "description":"ICSE Affiliation",
               "street":"Dawarka", "city":"Delhi", "state":"Delhi", "zip":"110075",
               "location":[28.5733056, 77.0122136], "fees":5000,
               "tags":["Good Faculty", "Great Sports"], "rating":"4.5"
            }
         },
		
         {
            "_index":"schools", "_type":"school", "_id":"1", "_score":1.0,
            "_source":{
               "name":"Central School", "description":"CBSE Affiliation",
               "street":"Nagan", "city":"paprola", "state":"HP", "zip":"176115",
               "location":[31.8955385, 76.8380405], "fees":2000,
               "tags":["Senior Secondary", "beautiful campus"], "rating":"3.5"
            }
         }
      ]
   }
}

Примечание. Если при выполнении вышеприведенного примера вы получили исключение, добавьте следующее сопоставление в свой индекс.