本地英文版地址: ../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 } } } }