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

Запросы состоят из условий (query clauses), которые могут выполняться в Контексте фильтра - проверяет соответствие документа условию Да/Нет и Контексте запроса - оценивает степень соответствия документа условию с расчетом релевантности

Основные концепции

Запросы состоят из условий (query clauses), которые могут выполняться в:

  1. Контексте фильтра - проверяет соответствие документа условию (“Да/Нет”)
  2. Контексте запроса - оценивает степень соответствия документа условию с расчетом релевантности

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

Релевантность измеряется числовым значением в поле _score:

"hits" : [
      {
        "_index" : "shakespeare",
        "_id" : "32437",
        "_score" : 18.781435,
        "_source" : {
          "type" : "line",
          "line_id" : 32438,
          "play_name" : "Hamlet",
          "speech_number" : 3,
          "line_number" : "1.1.3",
          "speaker" : "BERNARDO",
          "text_entry" : "Long live the king!"
        }
      },
...

Чем выше значение _score, тем более релевантен документ. Разные типы запросов используют различные алгоритмы расчета релевантности, но все учитывают тип контекста выполнения условия.

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

Характеристики:

  • Возвращает только факт соответствия (бинарный результат)
  • Не вычисляет оценку релевантности
  • Оптимален для точных значений
  • Результаты кэшируются для повышения производительности

Пример использования:

GET students/_search
{
  "query": {
    "bool": {
      "filter": [
        { "term": { "honors": true }},
        { "range": { "graduation_year": { "gte": 2020, "lte": 2022 }}}
      ]
    }
  }
}

Этот запрос ищет студентов:

  • С отличием (honors: true)
  • Выпустившихся в 2020-2022 годах

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

Характеристики:

  • Оценивает степень соответствия документа
  • Возвращает численную оценку релевантности
  • Используется для полнотекстового поиска
  • Поддерживает анализ текста (морфологию, синонимы)

Пример использования:

GET shakespeare/_search
{
  "query": {
    "match": {
      "text_entry": "long live king"
    }
  }
}

Этот запрос:

  • Ищет вариации фразы “long live king”
  • Учитывает словоформы и синонимы
  • Сортирует результаты по релевантности

Особенности вычисления _score

  • Используется 24-битная точность (числа с плавающей запятой)
  • При превышении точности может происходить потеря данных
  • Разные типы запросов используют различные алгоритмы расчета

Рекомендации по применению:

  1. Для точных значений (ID, даты, категории) используйте контекст фильтра
  2. Для текстового поиска применяйте контекст запроса
  3. Комбинируйте оба подхода в сложных запросах через bool запрос