Elasticsearch如何按同文档内两个不同属性的最大值排序
正确实现方案
报错根因
你的Painless脚本存在拼写错误:将toInstant方法误写为toInstance,ES内置的JodaCompatibleZonedDateTime类不存在toInstance方法,因此触发了运行时异常。
正确DSL写法
直接使用以下排序配置即可实现按两个日期字段的最大值降序排列:
{ "size": 12, "from": 0, "query": { // 此处保留你原有的查询逻辑 }, "sort": [ { "_script": { "type": "number", "script": { "lang": "painless", "source": """ long draftMills = doc['draft_recent_edit_at'].value.toInstant().toEpochMilli(); long recentMills = doc['recent_edit_at'].value.toInstant().toEpochMilli(); return Math.max(draftMills, recentMills); """ }, "order": "desc" } } ] }
可选优化(处理字段空值场景)
如果存在部分文档缺少draft_recent_edit_at或recent_edit_at字段的情况,可以增加空值判断避免脚本运行失败:
"source": """ long draftMills = doc.containsKey('draft_recent_edit_at') && !doc['draft_recent_edit_at'].empty ? doc['draft_recent_edit_at'].value.toInstant().toEpochMilli() : 0L; long recentMills = doc.containsKey('recent_edit_at') && !doc['recent_edit_at'].empty ? doc['recent_edit_at'].value.toInstant().toEpochMilli() : 0L; return Math.max(draftMills, recentMills); """
如果空值需要排在最后,把默认的0L改为负数即可。
内容的提问来源于stack exchange,提问作者Sahil Grover
相关产品推荐
相关产品推荐

