高效筛选elasticsearch数组内时间范围数据
本文介绍如何高效地从Elasticsearch文档中筛选出change_records数组内,change_time字段值位于特定时间范围且元素个数达到指定数量的文档。 我们面临的挑战是如何在不引发no field found错误的情况下,对数组内元素进行时间范围筛选和计数。
问题:我们需要查询change_records数组中,change_time字段值在指定时间范围(例如,一年)内,元素个数不少于指定数量(例如,10个)的文档。直接使用脚本查询会导致字段未找到的错误。
解决方案:采用script_score查询,结合自定义Painless脚本实现高效筛选。此方法避免了在filter中直接使用脚本带来的字段访问问题。
查询结构:
{ "query": { "script_score": { "query": { "match_all": {} // 可根据实际需求添加其他查询条件 }, "script": { "source": """ int count = 0; for (Map record : doc['change_records']) { long changeTime = record['change_time']; if (changeTime >= params.start && changeTime = params.n ? 1 : 0; """, "lang": "painless", "params": { "start": 1609459200000, // 2021年1月1日0时0分0秒的毫秒数 "end": 1704067200000, // 2024年1月1日0时0分0秒的毫秒数 "n": 10 // 至少需要10个change_time在指定时间范围内 } } } }}

代码解释:
script_score:使用脚本评分来筛选文档。query:可以添加其他查询条件,此处使用match_all匹配所有文档。script:Painless脚本,遍历change_records数组。count:计数器,统计满足时间范围条件的元素个数。循环体:获取每个change_record的change_time,并判断是否在指定范围内。return:如果count大于等于n,返回1(匹配),否则返回0(不匹配)。params:脚本参数,包含时间范围的起始和结束时间戳(毫秒),以及所需的最小匹配数量n。
此方法通过脚本评分,有效地解决了直接使用脚本查询时遇到的字段访问问题,并实现了对数组内元素的时间范围筛选和计数功能,从而高效地查找满足条件的文档。 请确保您的change_records字段映射正确,并且change_time字段为数值类型(例如long)。
以上就是Elasticsearch数组内时间范围筛选:如何高效查找change_records数组中指定时间范围内元素个数达到N的文档?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/174789.html
微信扫一扫
支付宝扫一扫