terms set

Поиск документов, соответствующих минимальному количеству указанных терминов

Terms Set Query (Запрос с условием минимального соответствия терминов)

Основное назначение

Запрос terms_set позволяет искать документы, которые соответствуют минимальному количеству точных терминов в указанном поле. В отличие от обычного terms запроса, terms_set требует явного указания минимального количества совпадений, которое может быть задано либо через поле индекса, либо через скрипт.

Основные характеристики

  • Ищет точные соответствия терминов (без анализа текста)
  • Требует указания минимального количества совпадающих терминов
  • Поддерживает два способа определения минимального количества:
    • Через поле документа (minimum_should_match_field)
    • Через скрипт (minimum_should_match_script)
  • Оптимален для работы с полями типа keyword

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

1. Подготовка индекса

PUT students
{
  "mappings": {
    "properties": {
      "name": { "type": "keyword" },
      "classes": { "type": "keyword" },
      "min_required": { "type": "integer" }
    }
  }
}

2. Индексация документов

PUT students/_doc/1
{
  "name": "Mary Major",
  "classes": [ "CS101", "CS102", "MATH101" ],
  "min_required": 2
}

PUT students/_doc/2
{
  "name": "John Doe",
  "classes": [ "CS101", "MATH101", "ENG101" ],
  "min_required": 2
}

3. Поиск с использованием поля для минимального соответствия

GET students/_search
{
  "query": {
    "terms_set": {
      "classes": {
        "terms": [ "CS101", "CS102", "MATH101" ],
        "minimum_should_match_field": "min_required"
      }
    }
  }
}

4. Поиск с использованием скрипта для минимального соответствия

GET students/_search
{
  "query": {
    "terms_set": {
      "classes": {
        "terms": [ "CS101", "CS102", "MATH101" ],
        "minimum_should_match_script": {
          "source": "Math.min(params.num_terms, doc['min_required'].value)"
        }
      }
    }
  }
}

Параметры запроса

Базовый синтаксис:

GET _search
{
  "query": {
    "terms_set": {
      "<поле>": {
        "terms": [ "term1", "term2" ],
        ...
      }
    }
  }
}
Параметр Тип данных Описание Обязательность
terms Массив строк Термины для поиска (точное соответствие) Обязательно
minimum_should_match_field Строка Поле, содержащее минимальное количество совпадений Один из двух
minimum_should_match_script Строка Скрипт, возвращающий минимальное количество совпадений Один из двух
boost Число с плавающей точкой Коэффициент релевантности (>1 - увеличивает, 0-1 - уменьшает) Опционально

Особенности работы

  1. Механизм подсчета:
    Документ считается соответствующим, если количество совпадающих терминов из массива terms ≥ указанного минимума.

  2. Определение минимума:

    • Через поле: значение берется из указанного поля документа
    • Через скрипт: вычисляется динамически для каждого документа
  3. Производительность:

    • Использование поля minimum_should_match_field обычно более эффективно
    • Скрипты обеспечивают гибкость, но могут снижать производительность

Рекомендации по использованию

  1. Для статических условий используйте minimum_should_match_field
  2. Для сложной логики применяйте minimum_should_match_script
  3. Всегда индексируйте поля, используемые для определения минимума
  4. Для текстовых полей предварительно применяйте нормализацию
  5. Тестируйте производительность на реалистичных объемах данных

Примеры скриптов

  1. Фиксированное значение:
"minimum_should_match_script": {
  "source": "2"
}
  1. Динамическое вычисление:
"minimum_should_match_script": {
  "source": "doc['min_required'].value * params.factor",
  "params": {
    "factor": 1.5
  }
}
  1. Ограничение сверху:
"minimum_should_match_script": {
  "source": "Math.min(5, doc['min_required'].value)"
}