原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-dsl-terms-set-query.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/query-dsl-terms-set-query.html

terms_set 查询

返回在指定字段中包含最少数量的确切的词项的文档。

除了可以定义返回文档必需匹配的词项的数量,terms_set 查询和 terms 查询 是一样的。例如:

  • 一个 programming_languages 字段,包含求职者的已知编程语言的列表,比如 c++javaphp。 可以使用 terms_set 查询返回至少匹配其中两种语言的文档。
  • 一个 permissions 字段,包含应用程序的可能的用户权限列表。 可以使用 terms_set 查询返回与这些权限的子集相匹配的文档。

请求示例

创建索引

要使用terms_set查询,在大多数情况下,需要在索引中包含一个numeric字段映射。 这个 numeric 字段包含返回文档所需的匹配项的数量。

要了解如何为terms_set查询设置索引,请尝试以下示例。

  1. 创建一个索引job-candidates(求职者),其字段映射如下:

    • name,一个 keyword 类型的字段。 此字段包含求职者的姓名。
    • programming_languages,一个 keyword 类型的字段。 此字段包含求职者已知的编程语言。
    • required_matches,一个 numeric long 类型的字段。 此字段包含返回文档所需的匹配项的数量。
    PUT /job-candidates
    {
        "mappings": {
            "properties": {
                "name": {
                    "type": "keyword"
                },
                "programming_languages": {
                    "type": "keyword"
                },
                "required_matches": {
                    "type": "long"
                }
            }
        }
    }
  2. 添加并索引一个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
    }
  3. 添加并索引另一个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_set的顶级参数

<field>
(必需, object) 你想搜索的字段。

<field>的参数

terms

(必需, array of strings) 你想在指定的<field>中搜索的词的数组。 要返回一个文档,所需数量的词项必须与字段值完全匹配,包括空格和大写。

所需的匹配词项的数量在参数 minimum_should_match_fieldminimum_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参数?

可以通过 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
            }
        }
    }
}