Метрическая агрегация Elasticsearch: количество элементов в массиве

Я хочу сделать довольно сложный запрос / агрегацию. Я не вижу как, потому что я только начал работать с ES. Документы у меня выглядят примерно так:

{
  "keyword": "some keyword",
  "items": [
    {
      "name":"my first item",
      "item_property_1":"A",
      ( other properties here )
    },
    {
      "name":"my second item",
      "item_property_1":"B",
      ( other properties here )
    },
    {
      "name":"my third item",
      "item_property_1":"A",
      ( other properties here )
    }
  ]
  ( other properties... )
},
{
  "keyword": "different keyword",
  "items": [
    {
      "name":"cool item",
      "item_property_1":"A",
      ( other properties here )
    },
    {
      "name":"awesome item",
      "item_property_1":"C",
      ( other properties here )
    },
  ]
  ( other properties... )
},
( other documents... )

Теперь я хотел бы подсчитать для каждого ключевого слова, сколько элементов существует, для какого из нескольких возможных значений может иметь свойство property_1. То есть я хочу агрегирование сегмента, которое будет иметь следующий ответ:

{
  "keyword": "some keyword",
  "item_property_1_aggretation": [
    {
      "key":"A",
      "count": 2,
    },
    {
      "key":"B",
      "count": 1,
    }
  ]
},
{
  "keyword": "different keyword",
  "item_property_1_aggretation": [
    {
      "key":"A",
      "count": 1,
    },
    {
      "key":"C",
      "count": 1,
    }
  ]
},
( other keywords... )

Если сопоставления необходимы, не могли бы вы также указать, какие именно? У меня нет каких-либо нестандартных сопоставлений, я просто выбросил туда все.

РЕДАКТИРОВАТЬ: избавляя вас от проблем, разместив здесь PUT для предыдущего примера

PUT /test/test/_bulk
{ "index": {}}
{  "keyword": "some keyword",  "items": [    {      "name":"my first item",      "item_property_1":"A"    },    {      "name":"my second item",      "item_property_1":"B"    },    {      "name":"my third item",      "item_property_1":"A"     }  ]}
{ "index": {}}
{  "keyword": "different keyword",  "items": [    {      "name":"cool item",      "item_property_1":"A"    },    {      "name":"awesome item",      "item_property_1":"C"    }  ]}

EDIT2:

Я только что попробовал это:

POST /test/test/_search
{
    "size":2,
    "aggregations": {
        "property_1_count": {
            "terms":{
                "field":"item_property_1"
            }
        }
    }
}

и получил это:

"aggregations": {
   "property_1_count": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
         {
            "key": "a",
            "doc_count": 2
         },
         {
            "key": "b",
            "doc_count": 1
         },
         {
            "key": "c",
            "doc_count": 1
         }
      ]
   }
}

близко, но не сигара. Вы можете видеть, что происходит, это ведро над каждымitem_property_1 независимо отkeyword это принадлежит. Я уверен, что решение состоит в том, чтобы правильно добавить некоторые сопоставления, но я не могу понять, как это сделать. Предложения?

РЕДАКТИРОВАТЬ3: На основании этого:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-nested-type.html Я хочу попробовать добавитьnested тип собственностиitems, Для этого я попытался:

PUT /test/_mapping/test
{
    "test":{
        "properties": {
            "items": {
                "type": "nested",
                "properties": {
                    "item_property_1":{"type":"string"}
                }
            }
        }
    }
}

Тем не менее, это возвращает ошибку:

{
   "error": "MergeMappingException[Merge failed with failures {[object mapping [items] can't be changed from non-nested to nested]}]",
   "status": 400
}

Это может быть связано с предупреждением на этом URL: «изменение типа объекта на вложенный тип требует переиндексации».

Итак, как мне это сделать?

Ответы на вопрос(1)

Ваш ответ на вопрос