Что касается структуры JSON, вам нужно сделать шаг назад и выяснить, хотите ли вы иметь пары list
или key-value
.
Глядя на ваш пример, я не думаю, что вам нужны пары key-value
, но опять же это то, что вы, возможно, захотите уточнить, разбираясь в своем домене, если будет еще несколько свойств для categories
.
Что касается агрегации, насколько я знаю, aggregations
будет работать с любой допустимой структурой JSON.
Для упомянутых вами данных вы можете воспользоваться приведенным ниже запросом aggregation
.Также я предполагаю, что поля имеют тип keyword
.
Запрос агрегации
POST <your_index_name>/_search
{
"size": 0,
"aggs": {
"myaggs": {
"terms": {
"size": 100,
"script": {
"inline": """
def myString = "";
def list = new ArrayList();
for(int i=0; i<doc['categories'].length; i++){
myString = doc['categories'][i] + ", " + doc['product'].value;
list.add(myString);
}
return list;
"""
}
}
}
}
}
Ответ агрегации
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0,
"hits": []
},
"aggregations": {
"myaggs": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "category1, productx",
"doc_count": 1
},
{
"key": "category2, productx",
"doc_count": 1
}
]
}
}
}
Надеюсь, это поможет!