Термино-уровневые запросы

Ищут точные значения без анализа текста. Не учитывают релевантность

Общее описание

Термино-уровневые запросы (term-level queries) выполняют поиск по индексу для нахождения документов, содержащих точное соответствие указанному термину. В отличие от полнотекстовых запросов, результаты термино-уровневых запросов не сортируются по оценке релевантности.

Ключевые особенности:

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

Типы термино-уровневых запросов

В таблице представлены все виды термино-уровневых запросов:

Тип запроса Описание
term Поиск документов, содержащих точное соответствие указанному термину в заданном поле
terms Поиск документов, содержащих один или несколько указанных терминов в заданном поле
terms_set Поиск документов, соответствующих минимальному количеству указанных терминов
ids Поиск документов по их идентификаторам
range Поиск документов, значения поля которых попадают в указанный диапазон
prefix Поиск документов, содержащих термины с указанным префиксом
exists Поиск документов, имеющих любое проиндексированное значение в указанном поле
fuzzy Поиск документов, содержащих термины, схожие с поисковым термином в пределах максимально допустимого расстояния Дамерау-Левенштейна (количество односимвольных изменений для преобразования одного термина в другой)
wildcard Поиск документов, содержащих термины, соответствующие шаблону с подстановочными символами
regexp Поиск документов, содержащих термины, соответствующие регулярному выражению

Практические рекомендации

  1. Для полей keyword всегда используйте термино-уровневые запросы:

    GET products/_search
    {
      "query": {
        "term": {
          "product_code": "ABC-123"
        }
      }
    }
    
  2. Избегайте использования термино-уровневых запросов для полей типа text, так как они проходят анализ при индексации.

  3. Для сложных условий комбинируйте несколько термино-уровневых запросов через bool:

    GET logs/_search
    {
      "query": {
        "bool": {
          "must": [
            { "term": { "status": "error" } },
            { "range": { "timestamp": { "gte": "2023-01-01" }}}
          ]
        }
      }
    }
    
  4. Для нечеткого поиска используйте fuzzy с указанием максимального расстояния:

    GET contacts/_search
    {
      "query": {
        "fuzzy": {
          "last_name": {
            "value": "Smith",
            "fuzziness": 2
          }
        }
      }
    }
    

Все технические термины сохранены в оригинальном написании (term, fuzzy, wildcard и т.д.) для соответствия международной практике, с добавлением пояснений на русском языке для лучшего понимания.