Проблема субагрегации, когда один документ
Я пытаюсь выполнить агрегацию по массиву элементов, и я не получаю ожидаемых результатов, когда выполняемый запрос соответствует только одному документу. То, что я пытаюсь сделать, это совокупность на основе 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"
}
}
}
Это возвращает следующий результат:
"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
}
}
]
}
Так что проблема в том, что он суммирует оба значения для каждого сегмента, а не разделяет их. Я бы ожидал SumItemCount
5 для "Виджета" и 1 для "FizzBuzz".
Я новичок в ES, но у моего работодателя есть приличный опыт работы с ним, и я знаю, что раньше мы использовали некоторые вложенные свойства, но в конечном итоге они были разорваны из-за других проблем. Мы также экспериментировали с конвейерами агрегации, но наши результаты такие же.
Как мы можем заставить это объединение работать для сценариев с одним документом? Мы застряли, возвращая вложенные свойства?
1 ответ
Вам нужно использовать Nested datatype и 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
}
}
]
}
}
}