Запрос набора терминов
Возвращает документы, содержащие минимальное количество точных терминов в указанном поле.
Запрос terms_set аналогичен запросу terms, за исключением того, что вы можете определить количество необходимых совпадающих терминов для возврата документа. Например:
- Поле
programming_languagesсодержит список известных языков программирования, таких какc++,javaилиphpдля кандидатов на работу. Вы можете использовать запросterms_setдля возврата документов, соответствующих как минимум двум из этих языков. - Поле
permissionsсодержит список возможных разрешений пользователя для приложения. Вы можете использовать запросterms_setдля возврата документов, соответствующих подмножеству этих разрешений.
Пример запроса
Настройка индекса
В большинстве случаев для использования запроса terms_set необходимо включить отображение числового поля в вашем индексе. Это числовое поле содержит количество совпадающих терминов, необходимых для возврата документа.
Чтобы увидеть, как настроить индекс для запроса terms_set, рассмотрите следующий пример.
-
Создайте индекс
job-candidatesсо следующими отображениями полей:-
name, полеkeyword. Это поле содержит имя кандидата на должность. -
programming_languages, полеkeyword. Это поле содержит языки программирования, известные кандидату на должность. -
required_matches, числовое полеlong. Это поле содержит количество совпадающих терминов, необходимых для возврата документа.
resp = client.indices.create( index="job-candidates", mappings={ "properties": { "name": { "type": "keyword" }, "programming_languages": { "type": "keyword" }, "required_matches": { "type": "long" } } }, ) print(resp)response = client.indices.create( index: 'job-candidates', body: { mappings: { properties: { name: { type: 'keyword' }, programming_languages: { type: 'keyword' }, required_matches: { type: 'long' } } } } ) puts responseconst response = await client.indices.create({ index: "job-candidates", mappings: { properties: { name: { type: "keyword", }, programming_languages: { type: "keyword", }, required_matches: { type: "long", }, }, }, }); console.log(response);PUT /job-candidates { "mappings": { "properties": { "name": { "type": "keyword" }, "programming_languages": { "type": "keyword" }, "required_matches": { "type": "long" } } } } -
-
Добавьте документ с ID
1и следующими значениями:-
Jane Smithв полеname. -
["c++", "java"]в полеprogramming_languages. -
2в полеrequired_matches.
Включите параметр
?refresh, чтобы документ был немедленно доступен для поиска.resp = client.index( index="job-candidates", id="1", refresh=True, document={ "name": "Jane Smith", "programming_languages": [ "c++", "java" ], "required_matches": 2 }, ) print(resp)response = client.index( index: 'job-candidates', id: 1, refresh: true, body: { name: 'Jane Smith', programming_languages: [ 'c++', 'java' ], required_matches: 2 } ) puts responseconst response = await client.index({ index: "job-candidates", id: 1, refresh: "true", document: { name: "Jane Smith", programming_languages: ["c++", "java"], required_matches: 2, }, }); console.log(response);PUT /job-candidates/_doc/1?refresh { "name": "Jane Smith", "programming_languages": [ "c++", "java" ], "required_matches": 2 } -
-
Добавьте другой документ с ID
2и следующими значениями:-
Jason Responseв полеname. -
["java", "php"]в полеprogramming_languages. -
2в полеrequired_matches.
resp = client.index( index="job-candidates", id="2", refresh=True, document={ "name": "Jason Response", "programming_languages": [ "java", "php" ], "required_matches": 2 }, ) print(resp)response = client.index( index: 'job-candidates', id: 2, refresh: true, body: { name: 'Jason Response', programming_languages: [ 'java', 'php' ], required_matches: 2 } ) puts responseconst response = await client.index({ index: "job-candidates", id: 2, refresh: "true", document: { name: "Jason Response", programming_languages: ["java", "php"], required_matches: 2, }, }); console.log(response);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.
resp = client.search(
index="job-candidates",
query={
"terms_set": {
"programming_languages": {
"terms": [
"c++",
"java",
"php"
],
"minimum_should_match_field": "required_matches"
}
}
},
)
print(resp) response = client.search(
index: 'job-candidates',
body: {
query: {
terms_set: {
programming_languages: {
terms: [
'c++',
'java',
'php'
],
minimum_should_match_field: 'required_matches'
}
}
}
}
)
puts response const response = await client.search({
index: "job-candidates",
query: {
terms_set: {
programming_languages: {
terms: ["c++", "java", "php"],
minimum_should_match_field: "required_matches",
},
},
},
});
console.log(response); 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,minimum_should_match_fieldилиminimum_should_match_script. Должен быть указан ровно один из этих параметров. -
minimum_should_match -
(Необязательно) Указание количества совпадающих терминов, необходимых для возврата документа.
Допустимые значения см. в параметре
minimum_should_match. -
minimum_should_match_field - (Необязательно, строка) Числовое поле содержащее количество совпадающих терминов, необходимых для возврата документа.
-
minimum_should_match_script -
(Необязательно, строка) Пользовательский скрипт, содержащий количество совпадающих терминов, необходимых для возврата документа.
Для параметров и допустимых значений см. Скрипты.
Пример запроса с использованием параметра
minimum_should_match_scriptсм. в How to use the параметр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.
resp = client.search(
index="job-candidates",
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
}
}
},
)
print(resp) response = client.search(
index: 'job-candidates',
body: {
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
}
}
}
}
)
puts response const response = await client.search({
index: "job-candidates",
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,
},
},
},
});
console.log(response); 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
}
}
}
}
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/query-dsl-terms-set-query.html
|
|