ElasticSearch 比较两个时间的大小

mac2024-03-23  27

当前版本7.2.0

由于有些场景需要根据条记录的两个时间来判断,得出另一个属性,所以就需要比较大小

场景:需要判断工单是否超时,已取消的工单,就需要根据取消时间 cancelTime 和超时时间 expireTime 比较,若 cancelTime 小于 expireTime,判定为正常,否则判定为超时

由于DSL不支持两个属性直接比较,目前只能借助脚本

问题1:两个时间的不能直接比较

Cannot apply [>] operation to types [org.elasticsearch.script.JodaCompatibleZonedDateTime] and [org.elasticsearch.script.JodaCompatibleZonedDateTime].

最开始的版本是支持这样比较的,但是6.1版本就移除了这个功能,所以要改用别的方法

Comparison (<) not supported on datetime fields anymore since upgrade to 6.1

然后只能查找其他方法,我也不记得是哪里找到的,好像是翻墙吧,现在再找找不到了,官方文档也没有翻到

doc['cancelTime'].value.toInstant().toEpochMilli()

问题2:脚本需要判空操作:这个方法是可以用,但是如果碰到有为空的属性就会报错,比如整个系统,肯定会有 cancelTime 不存在的数据,那么就会报错

A document doesn't have a value for a field! Use doc[<field>].size()==0 to check if a document is missing a field!

所以脚本还需要加上判空操作,终于查询成功

GET order_index_dev/_search { "query": { "bool": { "must": [ { "term": { "status": 5 } }, { "script": { "script": "if (doc['expireTime'].size()==0 || doc['cancelTime'].size()==0) {return false} else {return doc['cancelTime'].value.toInstant().toEpochMilli() > doc['expireTime'].value.toInstant().toEpochMilli()}" } } ] } } }

 

最新回复(0)