词集查询

编辑

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

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 字段。此字段包含返回文档所需的匹配词项的数量。
    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"
          }
        }
      }
    }
  2. 索引一个 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
    }
  3. 索引另一个 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_fieldrequired_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_matchminimum_should_match_fieldminimum_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
      }
    }
  }
}