Контекст запроса и фильтрации в Elasticsearch

Оценка релевантности

По умолчанию Elasticsearch сортирует совпадающие результаты поиска по оценке релевантности, которая измеряет, насколько хорошо каждый документ соответствует запросу.

Оценка релевантности - это положительное число с плавающей запятой, возвращаемое в поле метаданных _score поискового API. Чем выше _score, тем релевантнее документ. Хотя каждый тип запроса может вычислять оценки релевантности по-разному, расчет оценки также зависит от того, выполняется ли предложение запроса в контексте запроса или фильтра.

Контекст запроса

В контексте запроса предложение запроса отвечает на вопрос "Насколько хорошо этот документ соответствует этому предложению запроса?" Помимо определения соответствия документа, предложение запроса также вычисляет оценку релевантности в поле метаданных _score.

Контекст запроса действует всякий раз, когда предложение запроса передается параметру запроса, например параметру запроса в API поиска.

Контекст фильтра

В контексте фильтра предложение запроса отвечает на вопрос "Соответствует ли этот документ этому предложению запроса?" Ответ простой: да или нет - баллы не подсчитываются. Контекст фильтра в основном используется для фильтрации структурированных данных, например:

  • Попадает ли этот timestamp в диапазон с 2015 по 2016 год?
  • В поле статуса установлено значение "published"?

Часто используемые фильтры будут автоматически кэшироваться Elasticsearch для повышения производительности.

Контекст фильтра действует всякий раз, когда предложение запроса передается параметру фильтра, например параметрам filter или must_not в запросе bool, параметру фильтра в запросе constant_score или агрегированию фильтров.

Пример контекста запроса и фильтра

Ниже приведен пример предложений запроса, используемых в контексте запроса и фильтра в API поиска. Этот запрос будет соответствовать документам, в которых выполняются все следующие условия:

  • Поле title содержит слово search.
  • Поле content содержит слово elasticsearch.
  • Поле status содержит точное слово published.
  • Поле publish_date содержит дату с 1 января 2015 года.

GET /_search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "Search"        }},
        { "match": { "content": "Elasticsearch" }}
      ],
      "filter": [ 
        { "term":  { "status": "published" }},
        { "range": { "publish_date": { "gte": "2015-01-01" }}}
      ]
    }
  }
}

Параметр query указывает контекст запроса.

Операторы bool и два match используются в контексте запроса, что означает, что они используются для оценки того, насколько хорошо каждый документ соответствует.

Параметр filter указывает контекст фильтра. Его условия term и range используются в контексте фильтра. Они будут отфильтровывать документы, которые не совпадают, но не повлияют на оценку совпадающих документов.

Оценки, вычисленные для запросов в контексте запроса, представлены в виде чисел с плавающей запятой одинарной точности; для точности значения у них всего 24 бита. Вычисления очков, которые превышают точность мантиссы, будут преобразованы в числа с плавающей запятой с потерей точности.

Используйте предложения запроса в контексте запроса для условий, которые должны влиять на оценку совпадающих документов (то есть, насколько хорошо документ соответствует), и используйте все другие предложения запроса в контексте фильтра.


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

Комментарии

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

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

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

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