У меня есть следующее простое отображение:
"element": {
"dynamic": "false",
"properties": {
"id": { "type": "string", "index": "not_analyzed" },
"group": { "type": "string", "index": "not_analyzed" },
"type": { "type": "string", "index": "not_analyzed" }
}
}
Что в основном является способом хранения объекта Group
:
{
id : "...",
elements : [
{id: "...", type: "..."},
...
{id: "...", type: "..."}
]
}
Я хочу узнать, сколько существует разных групп, использующих один и тот же набор типов элементов (упорядоченных, включая повторения).
Очевидным решением было бы изменить схему на:
"element": {
"dynamic": "false",
"properties": {
"group": { "type": "string", "index": "not_analyzed" },
"concatenated_list_of_types": { "type": "string", "index": "not_analyzed" }
}
}
Но из-за требований нам нужно иметь возможность исключать некоторые типы из группы по (агрегации) :(
Все поля документа являются идентификаторами mongo, поэтому в SQL я бы сделал что-то вроде этого:
SELECT COUNT(id), concat_value FROM (
SELECT GROUP_CONCAT(type_id), group_id
FROM table
WHERE type_id != 'some_filtered_out_type_id'
GROUP BY group_id
) T GROUP BY concat_value
В Elastic с заданным отображением очень легко отфильтровать, также не проблема подсчитать, предполагая, что у нас есть объединенное значение. Излишне говорить, что суммирование не работает для строк.
Как я могу заставить это работать? :)
Спасибо!