Terms set query
source:www.elastic.co/guide/en/el…
path:Elasticsearch - Query DSL - Term-level queries - Terms set query
在指定field上搜索包含所指定数量以上的确切term的document。
terms_set query与terms query 一样,除了你可以指定返回的document所至少匹配的term数量。例如
- 一个名为
programming_languagesfield 包含一些编程语言名称,如c++,java, orphp,你可以使用terms_setquery来返回匹配至少两个这些编程语言的document。 - 一个名为
permissionsfield包含了一些一个应用中的用户权限,你可以使用terms_setquery来搜索与权限子集匹配的document。
Example request
Index setup
在大多数情况下,你需要在你的index中添加一个数字类型的field来使用terms_set query。这个数字代表了要返回一个document需要匹配的term数量。
要想知道怎么为terms_set query设置索引,请尝试下面的例子
-
创建一个索引,job-candidates,该索引有以下的field mapping:
name,一个keywordfield, 该field包含了job的候选人的名字programming_languages,一个keywordfield,该field包含了job候选人会的编程语言required_matches,一个数字longfield。该field包含了要满足的term数量如果要返回一个document
PUT /job-candidates { "mappings": { "properties": { "name": { "type": "keyword" }, "programming_languages": { "type": "keyword" }, "required_matches": { "type": "long" } } } }-
索引进一个document,其ID为1以及以下的值
namefield为Jane Smithprogramming_languagesfield为["c++", "java"]required_matchesfield为2
添加
?refresh参数以便该document可以立即被搜索到PUT /job-candidates/_doc/1?refresh { "name": "Jane Smith", "programming_languages": [ "c++", "java" ], "required_matches": 2 }-
再索引一个ID为2的document以及以下值
namefield为Jason Responseprogramming_languagesfield为["java", "php"]required_matchesfield 为 2
PUT /job-candidates/_doc/2?refresh { "name": "Jason Response", "programming_languages": [ "java", "php" ], "required_matches": 2 }你现在就可以使用
required_matchesfield 的值作为需要匹配term的数量阈值, 只有超过这个阈值,这个document才会返回。
Example query
如下所示,只有programming_languages field至少包含下面两个term的document才会被返回。
- c++
- java
- php
minimum_should_match_field的值就是 required_matches,这意味着需要匹配的term的数量为2,
GET /job-candidates/_search
{
"query": {
"terms_set": {
"programming_languages": {
"terms": [ "c++", "java", "php" ],
"minimum_should_match_field": "required_matches"
}
}
}
}
Top-level parameters for terms_set
field
(Required,object)想要搜索的field
Parameters for field
terms
(Required,array of strings)你想要在field中搜索的term数组。要返回的document必须精确匹配足够数量的term,包括空格和大小写。所需匹配term的数量定义在minimum_should_match_field or minimum_should_match_script参数中。
minimum_should_match_field
(Optional,string)数值类型的field,其值为至少应匹配的term数量如果要返回该document。
minimum_should_match_script
(Optional,string)自定义脚本,包含了至少应匹配的term数量如果要返回该document。详情请看 Scripting。相关示例为How to use the minimum_should_match_script parameter
Notes
How to use the minimum_should_match_script parameter
你可以使用minimum_should_match_script来定义匹配term所必需的数量。如果想动态设置该数量,该参数是非常有用的。
Example query using minimum_should_match_script
下面的query会返回programming_languagesfield上至少包含下面两项的document
c++javaphp
source参数代表了:
- 所必须匹配的term数量不能超过
params.num_terms,即在termsfield上定义的term数量 - 所必须匹配的term数量是2,即
required_matchesfield上的值