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

ElasticSearch - difference between two date fields

我在 ElasticSearch 中有一个索引,其中包含两个日期类型的字段 (metricsTime & arrivalTime)。下面引用了一份样本文件。在 Kibana 中,我为这两个字段之间的差异创建了一个脚本字段 delay。我的 painless 脚本是:

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
  ]
}

检查 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(比日期差多 1),那么您会看到上面的 query 不会 return 文档。

但是,尽管如此,我还是以查询为例提到了如何使用脚本来比较两个不同的问题,请参考我分享的link。