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上包含kimchy或elkbee的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是怎么工作的,尝试下面的示例
- 创建一个索引,其有一个名为
color的keywordfield
PUT my-index-000001
{
"mappings": {
"properties": {
"color": { "type": "keyword" }
}
}
}
- 索引进一个document,其ID为1,并且field
color上的值为["blue", "green"]
PUT my-index-000001/_doc/1
{
"color": ["blue", "green"]
}
- 再索引一个document,其ID为2,并且
colorfield的值为bule
PUT my-index-000001/_doc/2
{
"color": "blue"
}
- 使用带有terms lookup参数的
termsquery来进行搜索,根据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"
}
}
]
}
}