Elasticsearch - запрос DSL
В Elasticsearch поиск осуществляется с помощью запроса на основе JSON. Запрос состоит из двух предложений -
Leaf Query Clauses - Эти предложения - совпадение, термин или диапазон, которые ищут конкретное значение в определенном поле.
Compound Query Clauses - Эти запросы представляют собой комбинацию предложений конечных запросов и других составных запросов для извлечения нужной информации.
Elasticsearch поддерживает большое количество запросов. Запрос начинается с ключевого слова запроса, а затем содержит условия и фильтры в виде объекта JSON. Ниже описаны различные типы запросов.
Соответствовать всем запросам
Это самый простой запрос; он возвращает все содержимое и со счетом 1,0 для каждого объекта.
POST /schools/_search
{
"query":{
"match_all":{}
}
}
Запустив приведенный выше код, мы получаем следующий результат -
{
"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"
}
}
]
}
}
Полнотекстовые запросы
Эти запросы используются для поиска по всему тексту, например по главе или новостной статье. Этот запрос работает в соответствии с анализатором, связанным с этим конкретным индексом или документом. В этом разделе мы обсудим различные типы полнотекстовых запросов.
Соответствующий запрос
Этот запрос соответствует тексту или фразе со значениями одного или нескольких полей.
POST /schools*/_search
{
"query":{
"match" : {
"rating":"4.5"
}
}
}
При запуске приведенного выше кода мы получаем ответ, как показано ниже -
{
"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"
}
}
]
}
}
Запрос на несколько совпадений
Этот запрос соответствует тексту или фразе с более чем одним полем.
POST /schools*/_search
{
"query":{
"multi_match" : {
"query": "paprola",
"fields": [ "city", "state" ]
}
}
}
При запуске приведенного выше кода мы получаем ответ, как показано ниже -
{
"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.
POST /schools*/_search
{
"query":{
"query_string":{
"query":"beautiful"
}
}
}
При запуске приведенного выше кода мы получаем ответ, как показано ниже -
{
"took" : 60,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
………………………………….
Запросы на уровне термина
Эти запросы в основном имеют дело со структурированными данными, такими как числа, даты и перечисления.
POST /schools*/_search
{
"query":{
"term":{"zip":"176115"}
}
}
При запуске приведенного выше кода мы получаем ответ, как показано ниже -
……………………………..
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
],
}
}
]
…………………………………………..
Запрос диапазона
Этот запрос используется для поиска объектов, значения которых находятся между заданными диапазонами значений. Для этого нам нужно использовать такие операторы, как -
- gte - больше чем равно
- gt - больше чем
- lte - меньше чем равно
- lt - менее чем
Например, обратите внимание на код, приведенный ниже -
POST /schools*/_search
{
"query":{
"range":{
"rating":{
"gte":3.5
}
}
}
}
При запуске приведенного выше кода мы получаем ответ, как показано ниже -
{
"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"
}
}
]
}
}
Существуют и другие типы запросов на уровне терминов, такие как -
Exists query - Если определенное поле имеет ненулевое значение.
Missing query - Это полностью противоположно существующему запросу, этот запрос ищет объекты без определенных полей или полей, имеющих нулевое значение.
Wildcard or regexp query - Этот запрос использует регулярные выражения для поиска шаблонов в объектах.
Составные запросы
Эти запросы представляют собой набор различных запросов, объединенных друг с другом с использованием логических операторов, таких как and, or, not, для разных индексов или с вызовами функций и т. Д.
POST /schools/_search
{
"query": {
"bool" : {
"must" : {
"term" : { "state" : "UP" }
},
"filter": {
"term" : { "fees" : "2200" }
},
"minimum_should_match" : 1,
"boost" : 1.0
}
}
}
При запуске приведенного выше кода мы получаем ответ, как показано ниже -
{
"took" : 6,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 0,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
}
}
Географические запросы
Эти запросы касаются географических местоположений и географических точек. Эти запросы помогают найти школы или любой другой географический объект рядом с любым местом. Вам необходимо использовать тип данных гео-точки.
PUT /geo_example
{
"mappings": {
"properties": {
"location": {
"type": "geo_shape"
}
}
}
}
При запуске приведенного выше кода мы получаем ответ, как показано ниже -
{ "acknowledged" : true,
"shards_acknowledged" : true,
"index" : "geo_example"
}
Теперь размещаем данные в созданном выше индексе.
POST /geo_example/_doc?refresh
{
"name": "Chapter One, London, UK",
"location": {
"type": "point",
"coordinates": [11.660544, 57.800286]
}
}
При запуске приведенного выше кода мы получаем ответ, как показано ниже -
{
"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
]
}
}
}
}