Я пытаюсь сделать группу вasticsearch, несколькими полями. Я знаю, что вложенная агрегация существует, но я хочу включить в определенную группу запись, для которой поле, по которому я группирую, пусто.
Скажем, у нас есть такая структура данных:
SONG_ID | SONG_GENRE | SONG_ARTIST
и я хочу группировать по жанрам, художники.
Я хотел бы иметь группу для каждой возможной комбинации, т.е.
Группа по жанрам дает мне 5 групп (если жанров 5) плюс корзину, в которой находятся песни без жанра. группировка по артисту дает мне для каждого жанра ведро по артистам плюс одно с песнями без артиста.
По сути, я хотел бы получить те же результаты, что и при использовании группы. Это вообще возможно?
Вы можете подойти по-разному, чтобы решить ваши потребности.
Простейшим способом было бы индексировать фиксированное значение, скажем, «не упомянутое», по отношению к genre
поле songs
если жанра нету. Вы можете сделать это во время индексации или путем определения «null_value» в вашем отображении поля.
"SONG_GENRE": {"type": "string", "null_value": "notmentioned"},
"SONG_ARTIST": {"type": "string", "null_value": "notmentioned"},
Таким образом, во время агрегации (вложенной) вы автоматически найдете количество «не упомянутых» для песен, не имеющих жанра.
Другой подход заключается в использовании отсутствующего фильтра в качестве другой агрегации наряду с обычной агрегацией. Что-то вроде ниже.
{
"aggs": {
"SONG_GENRE": {
"terms": {
"field": "SONG_GENRE"},
"aggs": {
"SONG_ARTIST": {
"terms": {
"field": "SONG_ARTIST"}
},
"MISSING_SONG_ARTIST": {
"filter": {
"missing": {
"field": "SONG_ARTIST"}
}
}
}
},
"MISSING_SONG_GENRE": {
"filter": {
"missing": {
"field": "SONG_GENRE"}
},
"aggs": {
"MISSING_SONG_GENRE_SONG_ARTIST": {
"terms": {
"field": "SONG_ARTIST"}
},
"MISSING_SONG_GENRE_MISSING_SONG_ARTIST": {
"filter": {
"missing": {
"field": "SONG_ARTIST"}
}
}
}
}
}
}
Я не проверил синтаксис. Это просто чтобы дать вам идею
Другим способом взлома может быть обработка пропущенного количества (общее количество попаданий — все показатели агрегации) как значения против жанра.
Других решений пока нет …