Terms Query(多项条件精确匹配)
过滤具有与任何提供的多项条件词语(未分析)匹配的字段的文档。 例如:
GET /_search
{
"query": {
"terms" : { "user" : ["kimchy", "elasticsearch"]}
}
}
terms
和term
意思相近,从字面意思可以知道是多个条件。可以先初步理解为mysql 中的in
语句,如where name in ('A','B')
,term
可以理解成=
语句,如where name =‘A’
Terms lookup(多项)查找机制
当需要用大量的词语来指定 terms
过滤器时,Terms lookup 机制
可以有助于从索引中的文档中提取这些项值。一个具体的例子是过滤由你的followers
粉丝推送的tweet
(理解成微博)。在 term 过滤器中指定的用户ID的数量可以很多。在这种情况下,使用 terms 过滤器的词语查找机制是有意义的。
就是使用terms时,如果枚举项很多,不用一个个的列举出来,如果这些枚举项对应另一个索引中的某个字段(貌似必须是数组结构,未验证非数组结构),可以直接引用。
多项查找机制支持以下选项:
选项 | 说明 |
---|---|
index | index (索引)被用来提取项的值。默认当前 index (索引) |
type | type (类型)被用来提取项的值。 |
id | 用文档 id (ID)来提取项的值。 |
path | 指定为路径的字段,以获取 term (项)筛选器的实际值。 其实就是指定哪些字段作为搜索条件 |
routing | 检索外部 term (项)文档时要使用的自定义路由值。 |
terms 过滤器的值将从文档中具有指定ID和指定类型和索引的字段中获取。 在内部执行get请求以从指定路径获取值。 目前,此功能正常工作,需要存储_source
。
必须存储
_source
另外,如果“引用”词语数据不大,请考虑使用具有单个分片并在所有节点之间完全复制的索引。 如果可能,查找字词过滤器将更喜欢在本地节点上执行get请求,从而减少了联网需求。
执行包含大量terms 的Terms Query查询请求可能会非常慢,因为每个附加词语都需要额外的处理和内存。 为了防止这种情况,可以在Terms Query查询中直接或通过查找使用的最大术语数限制为
65536
。可以使用索引设置index.max_terms_count
更改特定索引的默认最大值。
terms lookup 查询例子
PUT /users/_doc/2 //user索引
{
"followers" : ["1", "3"] //有个粉丝字段,该用户有2个粉丝
}
PUT /tweets/_doc/1 //tweet索引,理解成微博
{
"user" : "1" //tweet归属用户
}
GET /tweets/_search //查询tweet索引
{
"query" : {
"terms" : {
"user" : { //terms lookup机制,等价于"user" :["1", "3"]
"index" : "users",
"type" : "_doc",
"id" : "2",
"path" : "followers"
}
}
}
}
curl 格式查询命令:
curl -XGET "100.40.164.63:9200/tweets/_search" --header "Content-Type:application/json" -d '
{
"query" : {
"terms" : {
"user" : {
"index" : "users",
"type" : "_doc",
"id" : "2",
"path" : "followers"
}
}
}
}'
如例子中的注释,通过入参,自动帮我们实现了填充,有点像以前的mysql 嵌套查询,select * from table A where name in (select name from B)
文档结构如果是数组形式的,且是对象数组(前面数组就是一个字符串数组),也支持
PUT /users/_doc/2
{
"followers" : [
{
"id" : "1"
},
{
"id" : "2"
}
]
}
使用 followers.id
即可
GET /tweets/_search
{
"query" : {
"terms" : {
"user" : {
"index" : "users",
"type" : "_doc",
"id" : "2",
"path" : "followers.id" //followers.id
}
}
}
}