当前版本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()}"
}
}
]
}
}
}