Можно ли вернуть более сложный ключ для совокупности сегментов в Elasticsearch? По умолчанию используется строка:
Запрос:
{
"aggregations" : {
"file.name" : {
"terms" : {
"field" : "file.name"
},
"aggregations" : {
"level" : {
"terms" : {
"field" : "level"
}
}
}
}
}
}
Результат:
{
"aggregations": {
"file.name": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [{
"key": "test-1.pdf",
"doc_count": 3,
"level": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [{
"key": "Warning",
"doc_count": 2
}, {
"key": "Error",
"doc_count": 1
}]
}
}]
}
}
}
Здесь мои агрегаты сгруппированы по имени файла. Мне действительно нужно больше полей, чем просто имя. Например, я хотел бы видеть идентификатор для документа:
{
"key": {
"id": "1",
"name": "test-1.pdf"
},
"doc_count": 3,
"level": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [{
"key": "Warning",
"doc_count": 2
}, {
"key": "Error",
"doc_count": 1
}]
}
}
Я не нашел ничего, что соответствовало бы этому требованию. Самым близким, что я нашел, является метрика скрипта, которая позволит мне разбить поля на строки:
Запрос:
{
"aggregations" : {
"file" : {
"terms" : {
"script" : {
"inline" : "doc['file.id'].value ? doc['file.id'].value + '|' + doc['file.name'].value : null"
},
"size" : 1000
},
"aggregations" : {
"level" : {
"terms" : {
"field" : "level"
}
}
}
}
}
}
Результат:
{
"aggregations": {
"file": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [{
"key": "f-2|test-1.pdf",
"doc_count": 3,
"level": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [{
"key": "Warning",
"doc_count": 2
}, {
"key": "Error",
"doc_count": 1
}]
}
}]
}
}
}
Полагаю, это сработает, но кажется немного грязным. Я пропускаю лучший вариант? Я полагаю, что должны быть некоторые другие творческие решения этой проблемы.