使用elasticsearch在组中的最新文档的聚合

时间:2014-06-16 08:42:22

标签: lucene elasticsearch aggregate

假设每个人都有几个包含值的文档:

{
  "name": "John",
  "value": 1,
  "timestamp": 2014-06-15
}

{
  "name": "John",
  "value": 2,
  "timestamp": 2014-06-16
}

{
  "name": "Sam",
  "value": 2,
  "timestamp": 2014-06-15
}

{
  "name": "Sam",
  "value": 3,
  "timestamp": 2014-06-16
}

  1. 如何获取每个人的最新文档列表?
  2. 如何获得每个人最新文档列表的平均值?给定样本数据,这将是2.5,而不是2。
  3. 是否存在可以实现此结果的存储桶和指标的某种组合?我是否需要将自定义聚合器实现为插件的一部分,还是必须在内存中执行此类计算?

2 个答案:

答案 0 :(得分:1)

第二个操作只是一个聚合,要获得value字段的平均值,您可以尝试以下方法:

curl -XPOST "http://DOMAIN:9200/your/data/_search" -d'
{
   "size": 0, 
   "aggregations": {
      "the_name": {
         "terms": {
            "field": "name",
            "order": {
               "value_avg": "desc"
            }
         },
         "aggregations": {
            "value_avg": {
               "avg": {
                  "field": "value"
               }
            }
         }
      }
   }
}'

要为您的第一个问题找到解决方案,我建议您按日期订购响应,然后在项目中忽略一个术语,当您有另一个具有相同名称的术语时(意味着在ES的响应后过滤数据)< / p>

答案 1 :(得分:1)

对于那些只需要找到最新 persons 的人,请尝试以下方法:

"aggs": {
    "personName": {
        "terms": {
            "field": "name",
            "size": 5,
            "order": {"timeCreated": "desc"}
        },
        "aggs": {
            "timeCreated": {
                "max": {"field": "timestamp"}
            }
        }
    }
}