Метрическая агрегация 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: «изменение типа объекта на вложенный тип требует переиндексации».
Итак, как мне это сделать?