Запросы на уровне термина в Elasticsearch: запрос набора терминов (terms_set)

Возвращает документы, содержащие минимальное количество точных терминов в указанном поле.

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

  • Поле programming_languages содержит список известных языков программирования, таких как c++, java или php для кандидатов на работу. Вы можете использовать запрос terms_set для возврата документов, которые соответствуют как минимум двум из этих языков.
  • Поле permissions содержит список возможных разрешений пользователя для приложения. Вы можете использовать запрос terms_set для возврата документов, которые соответствуют подмножеству этих разрешений.

Пример запроса

Настройка индекса

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

Чтобы узнать, как настроить индекс для запроса terms_set, попробуйте следующий пример.

1. Создайте индекс, job-candidates, со следующими сопоставлениями полей:

  • name, поле ключевого слова. Это поле содержит имя кандидата на работу.
  • programming_languages, поле ключевого слова. Это поле содержит языки программирования, известные соискателю.
  • required_matches, long числовое поле. Это поле содержит количество совпадающих терминов, необходимых для возврата документа.

PUT /job-candidates
{
  "mappings": {
    "properties": {
      "name": {
        "type": "keyword"
      },
      "programming_languages": {
        "type": "keyword"
      },
      "required_matches": {
        "type": "long"
      }
    }
  }
}

2. Проиндексируйте документ с идентификатором 1 и следующими значениями:

  • Jane Smith в поле name.
  • ["c++", "java"] в поле programming_languages.
  • 2 в поле required_matches.

Включите параметр ?refresh, чтобы документ сразу стал доступен для поиска.

PUT /job-candidates/_doc/1?refresh
{
  "name": "Jane Smith",
  "programming_languages": [ "c++", "java" ],
  "required_matches": 2
}

3. Проиндексируйте другой документ с идентификатором 2 и следующими значениями:

  • Jason Response в поле name.
  • ["java", "php"] в поле programming_languages.
  • 2 в поле required_matches.

PUT /job-candidates/_doc/2?refresh
{
  "name": "Jason Response",
  "programming_languages": [ "java", "php" ],
  "required_matches": 2
}

Теперь вы можете использовать значение поля required_matches в качестве количества совпадающих терминов, необходимых для возврата документа в запросе terms_set.

Следующий поиск возвращает документы, в которых поле programming_languages ​​содержит как минимум два из следующих терминов:

  • c++
  • java
  • php

minimum_should_match_field это required_matches. Это означает, что необходимое количество совпадающих терминов равно 2, значению поля required_matches.

GET /job-candidates/_search
{
  "query": {
    "terms_set": {
      "programming_languages": {
        "terms": [ "c++", "java", "php" ],
        "minimum_should_match_field": "required_matches"
      }
    }
  }
}

Параметры верхнего уровня для terms_set

field

(Обязательный, объект) Поле для поиска.

Параметры для field

terms

(Обязательный, массив строк) Массив терминов, которые вы хотите найти в указанном поле field. Чтобы вернуть документ, необходимое количество терминов должно точно соответствовать значениям полей, включая пробелы и заглавные буквы.

Требуемое количество совпадающих терминов определяется в параметре minimum_should_match_field или minimum_should_match_script.

minimum_should_match_field

(Необязательный, строка) Числовое поле, содержащее количество совпадающих терминов, необходимых для возврата документа.

minimum_should_match_script

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

Как использовать параметр minimum_should_match_script

Вы можете использовать minimum_should_match_script, чтобы определить необходимое количество совпадающих терминов с помощью сценария. Это полезно, если вам нужно динамически установить количество требуемых терминов.

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

Следующий поиск возвращает документы, в которых поле programming_languages ​​содержит как минимум два из следующих терминов:

  • c++
  • java
  • php

source параметр этого запроса указывает:

  • Требуемое количество терминов для сопоставления не может превышать params.num_terms, количество терминов, указанных в поле terms.
  • Требуемое количество терминов для сопоставления - 2, значение поля required_matches.

GET /job-candidates/_search
{
  "query": {
    "terms_set": {
      "programming_languages": {
        "terms": [ "c++", "java", "php" ],
        "minimum_should_match_script": {
          "source": "Math.min(params.num_terms, doc['required_matches'].value)"
        },
        "boost": 1.0
      }
    }
  }
}


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

Комментарии

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

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

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

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