词集查询
编辑词集查询
编辑返回在提供的字段中包含最少数量的确切词项的文档。
terms_set
查询与 terms
查询相同,不同之处在于您可以定义返回文档所需的匹配词项的数量。例如:
- 一个名为
programming_languages
的字段,包含已知编程语言的列表,例如求职者的c++
、java
或php
。您可以使用terms_set
查询来返回至少匹配两种这些语言的文档。 - 一个名为
permissions
的字段,包含应用程序的可能用户权限列表。您可以使用terms_set
查询来返回匹配这些权限子集的文档。
示例请求
编辑索引设置
编辑在大多数情况下,您需要在索引中包含一个数值字段映射才能使用 terms_set
查询。此数值字段包含返回文档所需的匹配词项的数量。
要了解如何为 terms_set
查询设置索引,请尝试以下示例。
-
创建一个名为
job-candidates
的索引,其中包含以下字段映射: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 response
const 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
的文档,并包含以下值:-
在
name
字段中为Jane Smith
。 -
在
programming_languages
字段中为["c++", "java"]
。 -
在
required_matches
字段中为2
。
包含
?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 response
const 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
的文档,并包含以下值:-
在
name
字段中为Jason Response
。 -
在
programming_languages
字段中为["java", "php"]
。 -
在
required_matches
字段中为2
。
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 response
const 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
参数的示例查询,请参阅如何使用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 } } } }