我在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
]
}
答案 0 :(得分:1)
检查Lucene Expressions的列表,以检查哪些表达式可用于日期字段以及如何使用它们
为简单起见,请检查以下query
。我在创建的样本索引中创建了两个字段metricsTime
和arrivalTime
。
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
不会返回文件。
但是,尽管如此,我还是以查询为例,因为使用脚本可以比较两个不同的查询,请参考我共享的链接。