本地英文版地址: ../en/query-dsl-terms-set-query.html
返回在指定字段中包含最少数量的确切的词项的文档。
除了可以定义返回文档必需匹配的词项的数量,terms_set 查询和 terms 查询 是一样的。例如:
-
一个
programming_languages字段,包含求职者的已知编程语言的列表,比如c++、java或php。 可以使用terms_set查询返回至少匹配其中两种语言的文档。 -
一个
permissions字段,包含应用程序的可能的用户权限列表。 可以使用terms_set查询返回与这些权限的子集相匹配的文档。
要使用terms_set查询,在大多数情况下,需要在索引中包含一个numeric字段映射。
这个 numeric 字段包含返回文档所需的匹配项的数量。
要了解如何为terms_set查询设置索引,请尝试以下示例。
-
创建一个索引
job-candidates(求职者),其字段映射如下:PUT /job-candidates { "mappings": { "properties": { "name": { "type": "keyword" }, "programming_languages": { "type": "keyword" }, "required_matches": { "type": "long" } } } } -
添加并索引一个id为
1的文档,字段值如下:-
name:Jane Smith -
programming_languages:["c++", "java"]。 -
required_matches:2
包含
?refresh参数,以便可以立即搜索文档。PUT /job-candidates/_doc/1?refresh { "name": "Jane Smith", "programming_languages": ["c++", "java"], "required_matches": 2 } -
-
添加并索引另一个id为
2的文档,字段值如下:-
name:Jason Response -
programming_languages:["java", "php"] -
required_matches:2
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 -
(必需, array of strings) 你想在指定的
<field>中搜索的词的数组。 要返回一个文档,所需数量的词项必须与字段值完全匹配,包括空格和大写。所需的匹配词项的数量在参数
minimum_should_match_field或minimum_should_match_script中定义。 -
minimum_should_match_field - (可选, string) 包含返回文档所需的匹配词项数量的numeric字段。
-
minimum_should_match_script -
(可选, string) 包含返回文档所需的匹配词项数量的自定义脚本。
参数及有效值请参考脚本。
有关使用
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
}
}
}
}