Elasticsearch查询:如何筛选嵌套对象最新日期字段值大于X的文档
需求一:筛选最新期财务报告中cash>200000的公司
要实现这个查询,需针对financials嵌套字段,结合脚本判断当前条目是否为该公司的最新报告,同时满足现金条件。以下是可行的查询语句:
{ "query": { "nested": { "path": "financials", "query": { "bool": { "filter": [ { "script": { "script": """ def maxDate = doc['financials.periodEndDate'].stream().map(d -> d.getValue()).max().get(); return doc['financials.periodEndDate'].getValue().equals(maxDate) && doc['financials.cash'].value > 200000; """ } } ] } }, "inner_hits": { "size": 1, "sort": [{"financials.periodEndDate": "desc"}] } } } }
nested查询确保在同一个嵌套对象范围内匹配日期和现金数据,避免跨条目匹配的问题。- 脚本先计算当前公司所有财务报告的最新日期,再验证当前条目是否为该日期且
cash>200000。 inner_hits用于返回匹配的具体财务条目,便于结果校验。
需求二:筛选倒数第二个最新日期的财务报告
要定位倒数第二个日期的财务报告,需先提取并排序公司的所有报告日期,再匹配对应条目。查询语句如下:
{ "query": { "nested": { "path": "financials", "query": { "bool": { "filter": [ { "script": { "script": """ def dates = doc['financials.periodEndDate'].stream().map(d -> d.getValue()).sorted().collect(Collectors.toList()); if (dates.size() < 2) { return false; } def secondLastDate = dates.get(dates.size() - 2); return doc['financials.periodEndDate'].getValue().equals(secondLastDate); """ } } ] } }, "inner_hits": { "size": 1, "sort": [{"financials.periodEndDate": "desc"}] } } } }
- 脚本提取当前公司的所有
periodEndDate并排序,若报告数量不足2则直接排除。 - 取出排序后列表的倒数第二个日期,匹配当前嵌套条目的日期即可。
inner_hits返回对应的倒数第二个报告条目。
内容的提问来源于stack exchange,提问作者gron
相关产品推荐
相关产品推荐

