ElasticSearch 比较两个时间的大小

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

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值