“LastUpdated”属性或_timestamp的聚合

时间:2014-08-13 21:46:17

标签: elasticsearch

我的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
  },
  ...
]

运行此聚合并在结果中获取有意义的密钥(即时间戳)的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

我已经为您测试并制作了一个时髦的脚本,

POST index/type/_search
{
   "aggs": {
      "counts": {
         "terms": {
            "script": "ts=doc['_timestamp'].getValue();v=doc['LastUpdated'].getValue();rv=v?:ts;rv",
            "lang": "groovy"
         }
      }
   }
}

返回所需的结果。

希望这有帮助!!谢谢!