terms 查询
只要有被提供的字段值(未被分析)被文档匹配,该文档将会被此terms查询匹配。
GET /_search
{
"query": {
"terms" : { "user" : ["kimchy", "elasticsearch"]}
}
}
高亮terms查询只会尽力,根据所选择的高亮器的实现以及terms查询中字段值的数量,terms查询中的字段值可能不会被高亮。
1 字段值查找机制
当需要指定具有大量字段值的terms过滤器时,从索引中的文档中获取这些字段值将会非常有用。一个具体的例子就是用于过滤粉丝发送的推文。可能会在字段值过滤器中指定大量的用户id,在这种情况下,使用字段值过滤器查找机制就极为重要。
字段值查找机制支持以下选项:
- index:从中获取字段值的索引
- type:从中获取字段值的类型
- id:从中获取字段值的文档的id
- path:设置为用于为terms过滤器获取确切值的路径的字段
- routing:当检索外部字段值文档时,需要使用自定义路由值
terms过滤器的值将会从由指定索引的指定类型的指定id确定的文档的字段中获取。在内部,需要执行获取请求来从指定路径获取值。此特性运行时,需要保证_source被存储。
如果“引用”字段值数据并不多,考虑使用具有单切片且跨所有节点备份的索引。查找字段值过滤器倾向于在本地节点上执行获取请求,尽量减少网络的使用。
执行具有大量字段值的terms查询将会非常缓慢,因为每个附加的字段值都需要额外的处理与内存。为了防止这一情况的发生,用于terms查询的字段值的最大数量(无论是直接指定的还是通过查找机制获取的)被限制为65536。对于特定索引,可以通过索引设置index.max_terms_count改变这一默认值。
2 案例:使用查找机制
PUT /users/_doc/2
{
"followers" : ["1", "3"]
}
PUT /tweets/_doc/1
{
"user" : "1"
}
note:设置user2的粉丝为user1与user3。
GET /tweets/_search
{
"query" : {
"terms" : {
"user" : {
"index" : "users",
"type" : "_doc",
"id" : "2",
"path" : "followers"
}
}
}
}
note:搜索user2的粉丝。
从文档查找获取terms查询所需的字段值,也可以从指定文档的内部对象的数组的指定字段中获取。
PUT /users/_doc/2
{
"followers" : [
{
"id" : "1"
},
{
"id" : "2"
}
]
}
note:查找路径设置为followers.id即可。