Составные запросы в 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"
        }
      }
    }
  }
}


Читайте также:

Комментарии

Популярные сообщения из этого блога

Язык поисковых запросов в Graylog

Нормальные формы, пример нормализации в базе данных

Хэш-таблица: разрешение коллизий