我们知道,elasticsearch在没有创建索引的时候,我们在插入数据的时候会在自动创建mapping,但是在查询的时候不是每一个document都包含所有的mapping字段的,因此有时候我们会有这样的需求:就是查询当前index索引里面缺失某些字段的文档信息,例如,我们再商品的索引里面,查询哪些商品没有评论的,这样的场景还有很多。这里就可以用到今天的exists查询。
举个例子,现在有两篇文档
{"name":"张三","type":1,"cts":"2020-01-12 15:16:17"} {"name":"张三","sex":"男","type":1,"cts":"2020-01-12 15:16:17"}
可以看到第二条数据比第一条多了一个sex字段,所以我们比如有这样的场景,想要查询含有sex字段的数据,此时就可以使用到exist函数,exists函数的语法如下:
{ "query": { "bool": { "must": [ { "exists": { "field": "${filed_name}" } } ] } } }
下面我们还是用之前的test索引来演示下:
一、查看test的索引
二、查找test索引中字段包含name字段的文档
post /test/_search { "query": { "bool": { "must": [ { "exists": { "field": "name" } } ] } } }
三、查找test索引中字段包含sex字段的文档
post /test/_search { "query": { "bool": { "must": [ { "exists": { "field": "sex" } } ] } } }
以上我们就演示了查找包含某个字段的文档,但是小伙伴可能有需求了,我想查找不包含sex字段的内容怎么办?此时可以直接推断出使用must_not即可,例如:
post /test/_search { "query": { "bool": { "must_not": [ { "exists": { "field": "sex" } } ] } } }
备注:
1、这个exists语法仅用于查询没有这个字段的文档信息
2、exists在早期版本里面是放在filter里面的,现在的版本里面都是统一放在query里面的。
3、在早期版本里面还有一个missing函数和exists是一样的效果,但是在elasticsearch5.x的版本开始被被废弃掉了。
还没有评论,来说两句吧...