术语集查询编辑

返回在提供的字段中包含至少指定数量的 精确 术语的文档。

terms_set 查询与 terms 查询 相同,区别在于您可以定义返回文档所需的匹配术语数量。例如

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

示例请求编辑

索引设置编辑

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

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

  1. 创建一个名为 job-candidates 的索引,并使用以下字段映射

    • name,一个 keyword 字段。此字段包含求职者的姓名。
    • programming_languages,一个 keyword 字段。此字段包含求职者已知的编程语言。
    • required_matches,一个 数字 long 字段。此字段包含返回文档所需的匹配术语数量。
    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"
          }
        }
      }
    }
  2. 索引一个 ID 为 1 的文档,并使用以下值

    • Jane Smithname 字段中。
    • ["c++", "java"]programming_languages 字段中。
    • 2required_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
    }
  3. 索引另一个 ID 为 2 的文档,并使用以下值

    • Jason Responsename 字段中。
    • ["java", "php"]programming_languages 字段中。
    • 2required_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_fieldrequired_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_fieldminimum_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
      }
    }
  }
}