《Elasticsearch:权威指南》Query DSL -- Term-level queries --Terms Query

Terms Query(多项条件精确匹配)

过滤具有与任何提供的多项条件词语(未分析)匹配的字段的文档。 例如:

GET /_search
{
    "query": {
        "terms" : { "user" : ["kimchy", "elasticsearch"]}
    }
}

termsterm意思相近,从字面意思可以知道是多个条件。可以先初步理解为mysql 中的in 语句,如 where name in ('A','B')term可以理解成 =语句,如where name =‘A’

Terms lookup(多项)查找机制

当需要用大量的词语来指定 terms 过滤器时,Terms lookup 机制 可以有助于从索引中的文档中提取这些项值。一个具体的例子是过滤由你的followers 粉丝推送的tweet(理解成微博)。在 term 过滤器中指定的用户ID的数量可以很多。在这种情况下,使用 terms 过滤器的词语查找机制是有意义的。

就是使用terms时,如果枚举项很多,不用一个个的列举出来,如果这些枚举项对应另一个索引中的某个字段(貌似必须是数组结构,未验证非数组结构),可以直接引用。

多项查找机制支持以下选项:

选项说明
indexindex (索引)被用来提取项的值。默认当前 index (索引)
typetype (类型)被用来提取项的值。
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
            }
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值