弹性搜索如何按日期分组(嵌套在数组中时)

时间:2016-02-23 11:11:52

标签: elasticsearch kibana kibana-4

我的数据库结构为:

{
    name:"string",
    ....
    arrayData: [ 
        { price:100, date: "yyyy-mm-dd" },
        { price:120, date: "yyyy-mm-dd" } ,
        { price:150, date: "yyyy-mm-dd" } ,
        { price:250, date: "yyyy-mm-dd" } 
    ]
}

如何获得2015年的平均价格

我目前的做法是使用此过滤器汇总价格:

{
  "range": {
    "arrayData.date": {
      "gte": "2015-01-01",
      "lt": "2016-01-01"
    }
  }
}

测试聚合:

"aggs": {
    "2": {
      "date_histogram": {
        "field": "arrayData.date",
        "interval": "1y",
        "time_zone": "Europe/Helsinki",
        "min_doc_count": 1
      },
      "aggs": {
        "1": {
          "avg": {
            "field": "arrayData.price"
          }
        }
      }
    }
  }

但是这也会得到文档中其他年份的平均值,并且在arrayData中具有匹配的日期。

这也适用于Kibana,因为最后我必须将它添加到仪表板。

2 个答案:

答案 0 :(得分:0)

使用术语聚合,您将获得结果。

       {
            "aggs": {
                 "date": {
                 "terms": {
                 "field": "date"
       },
           "aggs": {
                 "average": {
                 "avg": {
                 "field": "price"
                        }
                         }
                  }
                  }
                  }
                   }

答案 1 :(得分:0)

似乎我需要将数组中的对象映射为nested

根据弹性文档:

  

内部对象字段的数组无法按预期方式工作。   Lucene没有内部对象的概念,因此Elasticsearch会变平   将对象层次结构转换为字段名称和值的简单列表。对于   例如,以下文件:

{
  "user" : [ 
    {
      "first" : "John",
      "last" :  "Smith"
    },
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
}
     

将用户字段动态添加为对象类型的字段   将在内部转换为看起来更像的文档   这样:

{
  "user.first" : [ "alice", "john" ],
  "user.last" :  [ "smith", "white" ]
}