我的数据库结构为:
{
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,因为最后我必须将它添加到仪表板。
答案 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" ] }