我的Elasticsearch映射看起来像这样:
{
"myIndex": {
"mappings": {
"myType": {
"_timestamp": {
"enabled": true,
"store": true
},
"properties": {
"LastUpdated": {
"type": "date",
"format": "dateOptionalTime"
}
/* lots of other properties */
}
}
}
}
}
因此,_timestamp已启用,并且每个文档上还有 LastUpated 属性。 LastUpdated 可以具有与 _timestamp 不同的值:有时,文档会进行物理更新(例如更新非规范化数据),更新 _timestamp ,但 LastUpdated 保持不变,因为该文档实际上没有被更新"从商业角度来看。
此外,还有许多没有 LastUpdated 值的文档(主要是旧数据)。
我想做的是运行一个聚合,计算每个日历日的文档数量(请忽略日期需要午夜对齐的事实)。对于每个文档,如果它在那里,请使用 LastUpdated ,否则使用_timestamp。
以下是我尝试的内容:
{
"aggregations": {
"counts": {
"terms": {
"script": "doc.LastUpdated == empty ? doc._timestamp : doc.LastUpdated"
}
}
}
}
bucketization似乎在某种程度上起作用,但结果中的键看起来很奇怪:
buckets: [
{
key: org.elasticsearch.index.fielddata.ScriptDocValues$Longs@7ba1f463doc_count: 300544
}{
key: org.elasticsearch.index.fielddata.ScriptDocValues$Longs@5a298acbdoc_count: 257222
}{
key: org.elasticsearch.index.fielddata.ScriptDocValues$Longs@6e451b5edoc_count: 101117
},
...
]
运行此聚合并在结果中获取有意义的密钥(即时间戳)的正确方法是什么?
答案 0 :(得分:1)
我已经为您测试并制作了一个时髦的脚本,
POST index/type/_search
{
"aggs": {
"counts": {
"terms": {
"script": "ts=doc['_timestamp'].getValue();v=doc['LastUpdated'].getValue();rv=v?:ts;rv",
"lang": "groovy"
}
}
}
}
返回所需的结果。
希望这有帮助!!谢谢!