术语集查询
编辑术语集查询编辑
返回在提供的字段中包含至少指定数量的 精确 术语的文档。
terms_set
查询与 terms
查询 相同,区别在于您可以定义返回文档所需的匹配术语数量。例如
- 一个名为
programming_languages
的字段包含求职者已知的编程语言列表,例如c++
、java
或php
。您可以使用terms_set
查询返回至少匹配其中两种语言的文档。 - 一个名为
permissions
的字段包含应用程序可能的用户权限列表。您可以使用terms_set
查询返回匹配这些权限子集的文档。
示例请求编辑
索引设置编辑
在大多数情况下,您需要在索引中包含一个 数字 字段映射才能使用 terms_set
查询。此数字字段包含返回文档所需的匹配术语数量。
要了解如何为 terms_set
查询设置索引,请尝试以下示例。
-
创建一个名为
job-candidates
的索引,并使用以下字段映射response = client.indices.create( index: 'job-candidates', body: { mappings: { properties: { name: { type: 'keyword' }, programming_languages: { type: 'keyword' }, required_matches: { type: 'long' } } } } ) puts 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
参数,以便文档立即可供搜索。response = client.index( index: 'job-candidates', id: 1, refresh: true, body: { name: 'Jane Smith', programming_languages: [ 'c++', 'java' ], required_matches: 2 } ) puts 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
字段中。
response = client.index( index: 'job-candidates', id: 2, refresh: true, body: { name: 'Jason Response', programming_languages: [ 'java', 'php' ], required_matches: 2 } ) puts 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
字段的值。
response = client.search( index: 'job-candidates', body: { query: { terms_set: { programming_languages: { terms: [ 'c++', 'java', 'php' ], minimum_should_match_field: 'required_matches' } } } } ) puts 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_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
参数编辑
您可以使用 minimum_should_match_script
使用脚本定义所需的匹配术语数量。如果您需要动态设置所需的术语数量,这将非常有用。
使用 minimum_should_match_script
的示例查询编辑
以下搜索返回 programming_languages
字段中至少包含以下两个术语的文档
-
c++
-
java
-
php
此查询的 source
参数指示
- 所需的匹配术语数量不能超过
params.num_terms
,即terms
字段中提供的术语数量。 - 所需的匹配术语数量为
2
,即required_matches
字段的值。
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
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 } } } }