一个文档时的子聚合问题

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
            }
          }
        ]
      }
    }
  }