【问题标题】:ElasticSearch - difference between two date fieldsElasticSearch - 两个日期字段之间的差异
【发布时间】:2018-10-19 17:44:34
【问题描述】:

我在 ElasticSearch 中有一个索引,其中包含两个日期类型字段(metricsTimearrivalTime)。下面引用了一个示例文档。在 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
  ]
}

【问题讨论】:

    标签: datetime elasticsearch kibana elasticsearch-painless


    【解决方案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 不会返回文档。

    但是,尽管如此,我还是以该查询为例来说明如何使用脚本来比较两个不同的,请参考我分享的链接。

    【讨论】:

    • 谢谢卡马尔。 doc['arrivalTime'].date.dayOfYear - doc['metricsTime'].date.dayOfYear 对我来说也没有返回错误。但是,我需要在纪元秒内获得差异。如果我使用 dayOfYear,当两个字段属于两年(例如:31/12/2017 和 01/01/2018)时,我会遇到问题。
    • @Averell 另请查看此链接,其中包含更多详细信息。 elastic.co/guide/en/elasticsearch/painless/master/…
    • "日期字段被视为自 1970 年 1 月 1 日以来的毫秒数,并支持上面的 Numeric Fields API,以及对某些特定日期字段的访问权限:"
    • @Averell doc['arrivalTime'].date.getMillis() 认为这就是您要找的。让我知道这是否有帮助!
    • 谢谢。这项工作。不知道为什么你发给我的链接中没有提到它。
    猜你喜欢
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 2017-09-14
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 2015-09-14
    相关资源
    最近更新 更多