Сегментное агрегирование в 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+).


Читайте также:

Комментарии

Популярные сообщения из этого блога

Язык поисковых запросов в Graylog

Хэш-таблица: разрешение коллизий

Нормальные формы, пример нормализации в базе данных