一个文档时的子聚合问题
Sub-Aggregation Issue When One Document
我正在尝试对项目数组进行聚合,但当查询 运行 仅匹配单个文档时,我没有得到预期的结果。我想做的是基于 itemTypeName
进行聚合,然后对每个这样的桶求和 itemCount
。
我尝试汇总的示例记录:
"itemsSummed": [
{
"itemTypeID": 1,
"itemTypeName": "Widget",
"itemCount": 5
},
{
"itemTypeID": 3,
"itemTypeName": "FizzBuzz",
"itemCount": 1
}
]
这是元素的映射:
"itemsSummed": {
"properties": {
"itemTypeID": {
"type": "long"
},
"itemTypeName": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
},
"itemCount": {
"type": "double"
}
}
}
最后,这是我目前拥有的聚合查询:
"ByItemType": {
"terms": {
"field": "itemsSummed.itemTypeName.raw"
},
"aggs": {
"SumItemCount": {
"sum": {
"field": "itemsSummed.itemCount"
}
}
}
这returns结果如下:
"ByItemType": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "Widget",
"doc_count": 1,
"SumItemCount": {
"value": 6
}
},
{
"key": "FizzBuzz",
"doc_count": 1,
"SumItemCount": {
"value": 6
}
}
]
}
所以问题在于它是将每个桶的两个值相加,而不是将它们分开。我希望 "Widget" 的 SumItemCount
为 5,"FizzBuzz" 的 SumItemCount
为 1。
我是一名 ES 新手,但我的雇主对此有相当多的经验,而且我知道之前我们确实使用了一些嵌套属性,但由于其他问题最终被淘汰了。我们也用 aggregation pipelines 进行了试验,但我们的结果是一样的。
我们如何才能使这种聚合适用于单文档场景?我们是否卡住了嵌套属性?
您需要使用 Nested datatype and Nested Aggregation 才能完成这项工作。
具有嵌套数据类型的新映射:
{
"itemsSummed": {
"type": "nested", <--- This line is the only change in mapping.
"properties": {
"itemTypeID": {
"type": "long"
},
"itemTypeName": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
},
"itemCount": {
"type": "double"
}
}
}
}
嵌套聚合:
{
"aggs": {
"nestedAgg": {
"nested": {
"path": "itemsSummed"
},
"aggs": {
"ByItemType": {
"terms": {
"field": "itemsSummed.itemTypeName.raw"
},
"aggs": {
"SumItemCount": {
"sum": {
"field": "itemsSummed.itemCount"
}
}
}
}
}
}
}
}
响应:
"aggregations": {
"nestedAgg": {
"doc_count": 2,
"ByItemType": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "FizzBuzz",
"doc_count": 1,
"SumItemCount": {
"value": 1
}
},
{
"key": "Widget",
"doc_count": 1,
"SumItemCount": {
"value": 5
}
}
]
}
}
}
我正在尝试对项目数组进行聚合,但当查询 运行 仅匹配单个文档时,我没有得到预期的结果。我想做的是基于 itemTypeName
进行聚合,然后对每个这样的桶求和 itemCount
。
我尝试汇总的示例记录:
"itemsSummed": [
{
"itemTypeID": 1,
"itemTypeName": "Widget",
"itemCount": 5
},
{
"itemTypeID": 3,
"itemTypeName": "FizzBuzz",
"itemCount": 1
}
]
这是元素的映射:
"itemsSummed": {
"properties": {
"itemTypeID": {
"type": "long"
},
"itemTypeName": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
},
"itemCount": {
"type": "double"
}
}
}
最后,这是我目前拥有的聚合查询:
"ByItemType": {
"terms": {
"field": "itemsSummed.itemTypeName.raw"
},
"aggs": {
"SumItemCount": {
"sum": {
"field": "itemsSummed.itemCount"
}
}
}
这returns结果如下:
"ByItemType": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "Widget",
"doc_count": 1,
"SumItemCount": {
"value": 6
}
},
{
"key": "FizzBuzz",
"doc_count": 1,
"SumItemCount": {
"value": 6
}
}
]
}
所以问题在于它是将每个桶的两个值相加,而不是将它们分开。我希望 "Widget" 的 SumItemCount
为 5,"FizzBuzz" 的 SumItemCount
为 1。
我是一名 ES 新手,但我的雇主对此有相当多的经验,而且我知道之前我们确实使用了一些嵌套属性,但由于其他问题最终被淘汰了。我们也用 aggregation pipelines 进行了试验,但我们的结果是一样的。
我们如何才能使这种聚合适用于单文档场景?我们是否卡住了嵌套属性?
您需要使用 Nested datatype and Nested Aggregation 才能完成这项工作。
具有嵌套数据类型的新映射:
{
"itemsSummed": {
"type": "nested", <--- This line is the only change in mapping.
"properties": {
"itemTypeID": {
"type": "long"
},
"itemTypeName": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
},
"itemCount": {
"type": "double"
}
}
}
}
嵌套聚合:
{
"aggs": {
"nestedAgg": {
"nested": {
"path": "itemsSummed"
},
"aggs": {
"ByItemType": {
"terms": {
"field": "itemsSummed.itemTypeName.raw"
},
"aggs": {
"SumItemCount": {
"sum": {
"field": "itemsSummed.itemCount"
}
}
}
}
}
}
}
}
响应:
"aggregations": {
"nestedAgg": {
"doc_count": 2,
"ByItemType": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "FizzBuzz",
"doc_count": 1,
"SumItemCount": {
"value": 1
}
},
{
"key": "Widget",
"doc_count": 1,
"SumItemCount": {
"value": 5
}
}
]
}
}
}