Term-level queries.Terms query

185 阅读3分钟

Terms query

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

path:Elasticsearch - Query DSL - Term-level queries - Tems query

搜索指定field包含一个或多个指定term的document。

terms query其实和term query没什么不同,只不过可以对多个值进行搜索。如果document匹配至少一个搜索的term,那么它就是匹配的。如果想搜索匹配大于一个要搜索的term,请使用terms_set query

Example request

下面的query是搜索user.idfield上包含kimchyelkbee的documet

GET /_search
{
  "query": {
    "terms": {
      "user.id": [ "kimchy", "elkbee" ],
      "boost": 1.0
    }
  }
}

Top-level parameters for terms

field

(Optional,object)要搜索的field。参数的value是你想要在该field上搜索的term数组。一个document要想匹配该query,其field上值必须精确匹配一个或多个term,包含空格和大小写。

默认地,Elasticsearch限制terms query至多包含65536个term。可以通过修改 index.max_terms_count 来修改该限制。

**Note:**要想使用已存在的document的field上的值作为搜索的term,使用 terms lookup 参数。

boost

pass

Note

highlighting terms queries

Highlighting 是只能尽力而为。Elasticsearch对于termsqueries可能不会返回highlight结果,这取决于

  • Highlighter type
  • Number of terms in the query

Terms lookup

Terms lookup会从已存在的document取出field的值,然后Elasticsearch可以用这些值作为要搜索的terms。当我们要搜索的数量非常大时,这是很有用的。

要想运行terms lookup,field的_source必须启用。你不能在跨集群来运行terms lookup。

**Note:**默认地,Elasticsearch限制terms query最多能搜索65536个term。这包含使用terms lookup获取到的term。可使用index.max_terms_count 设置来改变限制数量。

要运行一个terms lookup,可使用下面的参数

Terms lookup parameters

index

(Required,string) 从哪个索引来获取field上的值

id

(Required,string)从哪个document上获取field上值的ID

path

(Required,string)从哪个field上获取field上的值。如果field上的值是一个嵌套对象,可以使用点符号语法来访问这些嵌套的对象。

routing

(Optional,string)要获取值的 document 的 Custom routing value,如果当该document索引时提供了自定义的routiing,该参数是必须的。

Terms lookup example

要想要知道terms lookup是怎么工作的,尝试下面的示例

  1. 创建一个索引,其有一个名为colorkeyword field
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "color": { "type": "keyword" }
    }
  }
}
  1. 索引进一个document,其ID为1,并且field color上的值为["blue", "green"]
PUT my-index-000001/_doc/1
{
  "color":   ["blue", "green"]
}
  1. 再索引一个document,其ID为2,并且color field的值为bule
PUT my-index-000001/_doc/2
{
  "color":   "blue"
}
  1. 使用带有terms lookup参数的terms query来进行搜索,根据document2的term进行搜索。
ET my-index-000001/_search?pretty
{
  "query": {
    "terms": {
        "color" : {
            "index" : "my-index-000001",
            "id" : "2",
            "path" : "color"
        }
    }
  }
}

因为document 2 和document 1都包含blue这个值,Elasticsearch会把这两个document都返回。

{
  "took" : 17,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my-index-000001",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "color" : [
            "blue",
            "green"
          ]
        }
      },
      {
        "_index" : "my-index-000001",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "color" : "blue"
        }
      }
    ]
  }
}