ElasticSearch-两个日期字段之间的差异

时间:2018-10-19 09:13:49

标签: datetime elasticsearch kibana elasticsearch-painless

我在ElasticSearch中有一个索引,其中有两个日期类型的字段( metricsTime arrivalTime )。下面引用了示例文档。在Kibana中,我为这两个字段之间的差异创建了一个脚本字段 delay 。我的无痛脚本是:

doc['arrivalTime'].value - doc['metricsTime'].value

但是,导航到Kibana的“发现”选项卡时收到以下错误消息: class_cast_exception:无法对[org.joda.time.MutableDateTime]和[org.joda.time]类型应用[-]操作.MutableDateTime]。 这看起来与https://discuss.elastic.co/t/problem-in-difference-between-two-dates/121655中提到的错误相同。但是该页面中的答案表明我的脚本是正确的。你能帮忙吗?

谢谢!

{
  "_index": "events",
  "_type": "_doc",
  "_id": "HLV274_1537682400000",
  "_version": 1,
  "_score": null,
  "_source": {
    "metricsTime": 1537682400000,
    "box": "HLV274",
    "arrivalTime": 1539930920347
  },
  "fields": {
    "metricsTime": [
      "2018-09-23T06:00:00.000Z"
    ],
    "arrivalTime": [
      "2018-10-19T06:35:20.347Z"
    ]
  },
  "sort": [
    1539930920347
  ]
}

1 个答案:

答案 0 :(得分:1)

检查Lucene Expressions的列表,以检查哪些表达式可用于日期字段以及如何使用它们

为简单起见,请检查以下query。我在创建的样本索引中创建了两个字段metricsTimearrivalTime

样本文档

POST mydateindex/mydocs/1
{
  "metricsTime": "2018-09-23T06:00:00.000Z",
  "arrivalTime": "2018-10-19T06:35:20.347Z"
}

使用轻松的脚本进行查询

POST mydateindex/_search
{ "query": {
    "bool": { 
      "must": {
        "match_all": {

        }
      },
        "filter": {
          "bool" : {
            "must" : {
                "script" : {
                    "script" : {
                        "inline" : "doc['arrivalTime'].date.dayOfYear - doc['metricsTime'].date.dayOfYear > params.difference",
                        "lang"   : "painless",
                        "params": {
                          "difference": 2
                        }
                    }
                }
            }
        }
        }

    }
  }
}

请注意查询中的以下行

"inline" : "doc['arrivalTime'].date.dayOfYear - doc['metricsTime'].date.dayOfYear > params.difference"

现在,如果将difference的值从2更改为26(比日期差多一),那么您会看到上面的query不会返回文件。

但是,尽管如此,我还是以查询为例,因为使用脚本可以比较两个不同的查询,请参考我共享的链接。