Term-level queries.Terms set query

96 阅读3分钟

Terms set query

source:www.elastic.co/guide/en/el…

path:Elasticsearch - Query DSL - Term-level queries - Terms set query

在指定field上搜索包含所指定数量以上的确切term的document。

terms_set query与terms query 一样,除了你可以指定返回的document所至少匹配的term数量。例如

  • 一个名为programming_languages field 包含一些编程语言名称,如 c++, java, or php,你可以使用terms_set query来返回匹配至少两个这些编程语言的document。
  • 一个名为permissions field包含了一些一个应用中的用户权限,你可以使用terms_setquery来搜索与权限子集匹配的document。

Example request

Index setup

在大多数情况下,你需要在你的index中添加一个数字类型的field来使用terms_set query。这个数字代表了要返回一个document需要匹配的term数量。

要想知道怎么为terms_set query设置索引,请尝试下面的例子

  1. 创建一个索引,job-candidates,该索引有以下的field mapping:

    • name,一个keyword field, 该field包含了job的候选人的名字
    • programming_languages,一个keyword field,该field包含了job候选人会的编程语言
    • required_matches,一个数字long field。该field包含了要满足的term数量如果要返回一个document
    PUT /job-candidates
    {
      "mappings": {
        "properties": {
          "name": {
            "type": "keyword"
          },
          "programming_languages": {
            "type": "keyword"
          },
          "required_matches": {
            "type": "long"
          }
        }
      }
    }
    
    1. 索引进一个document,其ID为1以及以下的值

    • name field为Jane Smith
    • programming_languages field为["c++", "java"]
    • required_matches field为2

    添加?refresh参数以便该document可以立即被搜索到

    PUT /job-candidates/_doc/1?refresh
    {
      "name": "Jane Smith",
      "programming_languages": [ "c++", "java" ],
      "required_matches": 2
    }
    
    1. 再索引一个ID为2的document以及以下值

    • name field为Jason Response
    • programming_languages field为["java", "php"]
    • required_matches field 为 2
    PUT /job-candidates/_doc/2?refresh
    {
      "name": "Jason Response",
      "programming_languages": [ "java", "php" ],
      "required_matches": 2
    }
    

    你现在就可以使用required_matches field 的值作为需要匹配term的数量阈值, 只有超过这个阈值,这个document才会返回。

Example query

如下所示,只有programming_languages field至少包含下面两个term的document才会被返回。

  • c++
  • java
  • php

minimum_should_match_field的值就是 required_matches,这意味着需要匹配的term的数量为2,

GET /job-candidates/_search
{
  "query": {
    "terms_set": {
      "programming_languages": {
        "terms": [ "c++", "java", "php" ],
        "minimum_should_match_field": "required_matches"
      }
    }
  }
}

Top-level parameters for terms_set

field

(Required,object)想要搜索的field

Parameters for field

terms

(Required,array of strings)你想要在field中搜索的term数组。要返回的document必须精确匹配足够数量的term,包括空格和大小写。所需匹配term的数量定义在minimum_should_match_field or minimum_should_match_script参数中。

minimum_should_match_field

(Optional,string)数值类型的field,其值为至少应匹配的term数量如果要返回该document。

minimum_should_match_script

(Optional,string)自定义脚本,包含了至少应匹配的term数量如果要返回该document。详情请看 Scripting。相关示例为How to use the minimum_should_match_script parameter

Notes

How to use the minimum_should_match_script parameter

你可以使用minimum_should_match_script来定义匹配term所必需的数量。如果想动态设置该数量,该参数是非常有用的。

Example query using minimum_should_match_script

下面的query会返回programming_languagesfield上至少包含下面两项的document

  • c++
  • java
  • php

source参数代表了:

  • 所必须匹配的term数量不能超过params.num_terms,即在terms field上定义的term数量
  • 所必须匹配的term数量是2,即required_matches field上的值