Проблема субагрегации, когда один документ

Я пытаюсь выполнить агрегацию по массиву элементов, и я не получаю ожидаемых результатов, когда выполняемый запрос соответствует только одному документу. То, что я пытаюсь сделать, это совокупность на основе 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
            }
          }
        ]
      }
    }
  }
Другие вопросы по тегам