Elastic索引文档日期比较与多维度统计需求咨询
Elasticsearch 多条件文档统计方案
针对你提到的三个统计需求,我直接给你对应的查询DSL和详细解释,都是基于bool复合查询的组合,刚好适配你的可选字段场景:
1. 统计包含FirstJobEndDate字段的文档数量
这个确实最简单,直接用exists查询配合count API就能搞定:
GET /your_index_name/_count { "query": { "exists": { "field": "FirstJobEndDate" } } }
返回的count值就是你要的结果,它会精准匹配所有存在这个字段的文档,不管字段值是什么。
2. 统计FirstJobEndDate早于当前日期,且完全不含SecondJobStartDate、SecondJobEndDate、ThirdJobStartDate的文档数量
这个需要组合两个核心条件:必须满足日期小于当前时间,同时必须不包含三个字段中的任意一个。这里要注意,must_not里要排除掉存在任意目标字段的文档,所以用嵌套的bool查询来实现:
GET /your_index_name/_count { "query": { "bool": { "must": [ { "range": { "FirstJobEndDate": { "lt": "now" } } } ], "must_not": [ { "bool": { "should": [ {"exists": {"field": "SecondJobStartDate"}}, {"exists": {"field": "SecondJobEndDate"}}, {"exists": {"field": "ThirdJobStartDate"}} ], "minimum_should_match": 1 } } ] } } }
解释一下:
must里的range查询确保FirstJobEndDate早于当前时间(now是Elasticsearch的内置时间变量,会自动取当前服务器时间)must_not里的嵌套bool查询,用should列出三个要排除的字段,minimum_should_match:1表示只要存在其中任意一个字段,就会被排除,刚好符合你“完全不包含任一字段”的要求
3. 统计包含FirstJobEndDate字段,且至少包含SecondJob相关字段的文档数量
假设你说的SecondJob相关字段是指SecondJobStartDate、SecondJobEndDate这类(你原文没写完,我按常规场景补充),这个需求刚好是第二个需求的互补逻辑:必须存在FirstJobEndDate,且至少存在一个SecondJob类字段。用bool查询的must+should组合即可:
GET /your_index_name/_count { "query": { "bool": { "must": [ {"exists": {"field": "FirstJobEndDate"}} ], "should": [ {"exists": {"field": "SecondJobStartDate"}}, {"exists": {"field": "SecondJobEndDate"}} // 如果还有其他SecondJob相关字段,直接在这里添加对应的exists查询即可 ], "minimum_should_match": 1 } } }
解释:
must确保文档一定有FirstJobEndDate字段should列出所有需要检查的SecondJob相关字段,minimum_should_match:1表示只要存在其中至少一个,就算符合条件
另外提个小技巧:如果你的索引数据量特别大,这些count查询可能会有点慢,可以考虑用cardinality聚合配合过滤,但对于常规规模的索引,直接用count API已经足够高效了。
内容的提问来源于stack exchange,提问作者Dixyantar Panda
相关产品推荐
相关产品推荐

