如何在Elasticsearch中排除仅含指定元素的文档并统计数量
解决方案
要排除仅包含"green"的文档,你可以通过布尔查询结合脚本判断数组长度,或者提前存储数组长度字段两种方式实现,无需枚举所有非目标颜色:
方法一:使用脚本判断数组长度(无需修改索引结构)
通过must_not排除同时满足「包含green」和「colour数组长度为1」的文档:
GET colours/_search { "query": { "bool": { "must_not": [ { "bool": { "must": [ { "term": { "colour": "green" } }, { "script": { "source": "doc['colour'].length == 1" } } ] } } ] } }, "track_total_hits": true }
该查询会过滤掉仅含green的文档(ID=3),返回ID=1和2的文档,统计结果为2。
方法二:提前存储数组长度(性能更优)
如果对查询性能有要求,可以在索引文档时新增一个colour_count字段,记录colour数组的长度:
POST colours/_doc/1 { "colour": ["green", "red", "blue", "yellow", "pink", "orange", "dark", "bright", "lilac", "turquoise", "gold", "silver"], "colour_count": 12 } POST colours/_doc/2 { "colour": ["blue", "yellow"], "colour_count": 2 } POST colours/_doc/3 { "colour": ["green"], "colour_count": 1 }
之后用普通查询即可排除目标文档,避免运行时脚本的性能开销:
GET colours/_search { "query": { "bool": { "must_not": [ { "bool": { "must": [ { "term": { "colour": "green" } }, { "term": { "colour_count": 1 } } ] } } ] } }, "track_total_hits": true }
内容的提问来源于stack exchange,提问作者jwpol
相关产品推荐
相关产品推荐

