Сегментное агрегирование в Elasticsearch: агрегирование матрицы смежности
Это агрегация сегментов (bucket aggregation), возвращающая форму матрицы смежности. Запрос предоставляет набор именованных выражений фильтра, аналогичный запросу агрегирования фильтров. Каждый сегмент в ответе представляет собой непустую ячейку в матрице пересекающихся фильтров.
Учитывая фильтры с именами A, B и C, ответ вернет сегменты со следующими именами:
Пересекающиеся сегменты, например A&C, помечаются с использованием комбинации двух имен фильтров с разделителем по умолчанию &. Обратите внимание, что ответ также не включает сегмент C&A, поскольку это будет тот же набор документов, что и A&C. Матрица называется симметричной, поэтому мы возвращаем только ее половину. Для этого мы сортируем строки имен фильтров и всегда используем наименьшее значение в паре в качестве значения слева от разделителя.
Пример
В следующей агрегации взаимодействий используется adjacency_matrix, чтобы определить, какие группы людей обменивались электронными письмами.
PUT emails/_bulk?refresh
{ "index" : { "_id" : 1 } }
{ "accounts" : ["hillary", "sidney"]}
{ "index" : { "_id" : 2 } }
{ "accounts" : ["hillary", "donald"]}
{ "index" : { "_id" : 3 } }
{ "accounts" : ["vladimir", "donald"]}
GET emails/_search
{
"size": 0,
"aggs" : {
"interactions" : {
"adjacency_matrix" : {
"filters" : {
"grpA" : { "terms" : { "accounts" : ["hillary", "sidney"] }},
"grpB" : { "terms" : { "accounts" : ["donald", "mitt"] }},
"grpC" : { "terms" : { "accounts" : ["vladimir", "nigel"] }}
}
}
}
}
}
Ответ содержит сегменты с количеством документов для каждого фильтра и комбинации фильтров. Сегменты с неподходящими документами исключаются из ответа.
{
"took": 9,
"timed_out": false,
"_shards": ...,
"hits": ...,
"aggregations": {
"interactions": {
"buckets": [
{
"key":"grpA",
"doc_count": 2
},
{
"key":"grpA&grpB",
"doc_count": 1
},
{
"key":"grpB",
"doc_count": 2
},
{
"key":"grpB&grpC",
"doc_count": 1
},
{
"key":"grpC",
"doc_count": 1
}
]
}
}
}
Параметры
filters
(Обязательный, объект) Фильтры, используемые для создания корзин.
Свойства фильтров
filter
(Обязательный, объект DSL запроса) Запрос, используемый для фильтрации документов. key - это имя фильтра.
Требуется хотя бы один фильтр. Общее количество фильтров не может превышать значение index.query.bool.max_clause_count.
separator
(Необязательный, строка) Разделитель, используемый для объединения имен фильтров. По умолчанию &.
Тело ответа
key
(строка) Фильтры для сегмента. Если в сегменте используется несколько фильтров, имена фильтров объединяются с помощью разделителя.
document_count
(целое число) Количество документов, соответствующих фильтрам сегмента.
Использование
Сама по себе эта агрегация может предоставить все данные, необходимые для создания неориентированного взвешенного графа. Однако при использовании с дочерними агрегациями, такими как date_histogram, результаты могут предоставить дополнительные уровни данных, необходимые для выполнения динамического сетевого анализа, когда становится важным изучение взаимодействий с течением времени.
Ограничения фильтра
Для N фильтров матрица создаваемых сегментов может быть N²/2, поэтому по умолчанию установлено максимум 100 фильтров. Этот параметр можно изменить с помощью параметра уровня индекса index.max_adjacency_matrix_filters (обратите внимание, что этот параметр устарел и будет заменен index.query.bool.max_clause_count в версии 8.0+).
Читайте также:
Комментарии
Отправить комментарий