Составные запросы в Elasticsearch: логический (boolean) запрос
Запрос, который сопоставляет документы, соответствующие логическим комбинациям других запросов. Запрос bool отображается в Lucene BooleanQuery. Он построен с использованием одного или нескольких логических предложений, каждое из которых имеет типизированное вхождение. Типы событий:
must
Предложение (запрос) должно появляться в соответствующих документах и вносить вклад в оценку.
filter
Предложение (запрос) должно появиться в соответствующих документах. Однако, в отличие от must, оценка запроса будет проигнорирована. Предложения фильтра выполняются в контексте фильтра, что означает, что оценка игнорируется, а предложения рассматриваются для кэширования.
should
Предложение (запрос) должно (следует) появиться в соответствующем документе.
must_not
Предложение (запрос) не должно появляться в соответствующих документах. Пункты выполняются в контексте фильтра, что означает, что оценка игнорируется, а предложения рассматриваются для кэширования. Поскольку оценка игнорируется, для всех документов возвращается оценка 0.
В запросе bool используется подход "чем больше совпадений, тем лучше", поэтому оценка каждого соответствующего предложения must или should будет складываться вместе, чтобы получить окончательный _score для каждого документа.
POST _search
{
"query": {
"bool" : {
"must" : {
"term" : { "user.id" : "kimchy" }
},
"filter": {
"term" : { "tags" : "production" }
},
"must_not" : {
"range" : {
"age" : { "gte" : 10, "lte" : 20 }
}
},
"should" : [
{ "term" : { "tags" : "env1" } },
{ "term" : { "tags" : "deployed" } }
],
"minimum_should_match" : 1,
"boost" : 1.0
}
}
}
Использование minimum_should_match
Вы можете использовать параметр minimum_should_match, чтобы указать количество или процентное соотношение возвращаемых документов, которые должны совпадать.
Если запрос типа bool включает хотя бы одно предложение should и не содержит предложений must или filter, значение по умолчанию равно 1. В противном случае значение по умолчанию равно 0.
Подсчет очков с помощью bool.filter
Запросы, указанные в элементе фильтра, не влияют на оценку - оценки возвращаются как 0. На оценки влияет только указанный запрос. Например, все три из следующих запросов возвращают все документы, в которых поле статуса содержит term active.
Этот первый запрос присваивает всем документам оценку 0, так как запрос оценки не был указан:
GET _search
{
"query": {
"bool": {
"filter": {
"term": {
"status": "active"
}
}
}
}
}
Этот запрос типа bool имеет запрос match_all, который присваивает всем документам оценку 1.0.
GET _search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"term": {
"status": "active"
}
}
}
}
}
Этот запрос constant_score ведет себя точно так же, как и во втором примере выше. Запрос constant_score присваивает оценку 1.0 всем документам, соответствующим фильтру.
GET _search
{
"query": {
"constant_score": {
"filter": {
"term": {
"status": "active"
}
}
}
}
}
Именованные запросы
Каждый запрос принимает _name в определении верхнего уровня. Вы можете использовать именованные запросы, чтобы отслеживать, какие запросы соответствуют возвращенным документам. Если используются именованные запросы, ответ включает свойство matched_queries для каждого попадания.
GET /_search
{
"query": {
"bool": {
"should": [
{ "match": { "name.first": { "query": "ivan", "_name": "first" } } },
{ "match": { "name.last": { "query": "petrov", "_name": "last" } } }
],
"filter": {
"terms": {
"name.last": [ "petrov", "kimchy" ],
"_name": "test"
}
}
}
}
}
Читайте также:
Комментарии
Отправить комментарий