Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Агрегирование ›Агрегирование по корзинам

Агрегирование матрицей смежности

Агрегирование по корзинам, возвращающее форму матрицы смежности. Запрос предоставляет набор именованных выражений фильтра, аналогичных запросу агрегирования filters. Каждая корзина в ответе представляет собой непустую ячейку в матрице пересекающихся фильтров.

Для фильтров с именами A, B и C ответ вернёт корзины с такими именами:

A B C

A

A

A&B

A&C

B

B

B&C

C

C

Пересекающиеся корзины, например A&C, маркируются с использованием комбинации имён двух фильтров с разделителем по умолчанию &. Обратите внимание, что ответ не включает также корзину C&A, так как это был бы тот же набор документов, что и A&C. Матрица считается симметричной, поэтому мы возвращаем только половину её. Для этого мы сортируем строки имён фильтров и всегда используем наименьшее из пары в качестве значения слева от разделителя.

Пример

Следующее агрегирование interactions использует adjacency_matrix для определения групп лиц, которые обменивались электронными письмами.

resp = client.bulk(
    index="emails",
    refresh=True,
    operations=[
        {
            "index": {
                "_id": 1
            }
        },
        {
            "accounts": [
                "hillary",
                "sidney"
            ]
        },
        {
            "index": {
                "_id": 2
            }
        },
        {
            "accounts": [
                "hillary",
                "donald"
            ]
        },
        {
            "index": {
                "_id": 3
            }
        },
        {
            "accounts": [
                "vladimir",
                "donald"
            ]
        }
    ],
)
print(resp)

resp1 = client.search(
    index="emails",
    size=0,
    aggs={
        "interactions": {
            "adjacency_matrix": {
                "filters": {
                    "grpA": {
                        "terms": {
                            "accounts": [
                                "hillary",
                                "sidney"
                            ]
                        }
                    },
                    "grpB": {
                        "terms": {
                            "accounts": [
                                "donald",
                                "mitt"
                            ]
                        }
                    },
                    "grpC": {
                        "terms": {
                            "accounts": [
                                "vladimir",
                                "nigel"
                            ]
                        }
                    }
                }
            }
        }
    },
)
print(resp1)
response = client.bulk(
  index: 'emails',
  refresh: true,
  body: [
    {
      index: {
        _id: 1
      }
    },
    {
      accounts: [
        'hillary',
        'sidney'
      ]
    },
    {
      index: {
        _id: 2
      }
    },
    {
      accounts: [
        'hillary',
        'donald'
      ]
    },
    {
      index: {
        _id: 3
      }
    },
    {
      accounts: [
        'vladimir',
        'donald'
      ]
    }
  ]
)
puts response

response = client.search(
  index: 'emails',
  body: {
    size: 0,
    aggregations: {
      interactions: {
        adjacency_matrix: {
          filters: {
            "grpA": {
              terms: {
                accounts: [
                  'hillary',
                  'sidney'
                ]
              }
            },
            "grpB": {
              terms: {
                accounts: [
                  'donald',
                  'mitt'
                ]
              }
            },
            "grpC": {
              terms: {
                accounts: [
                  'vladimir',
                  'nigel'
                ]
              }
            }
          }
        }
      }
    }
  }
)
puts response
const response = await client.bulk({
  index: "emails",
  refresh: "true",
  operations: [
    {
      index: {
        _id: 1,
      },
    },
    {
      accounts: ["hillary", "sidney"],
    },
    {
      index: {
        _id: 2,
      },
    },
    {
      accounts: ["hillary", "donald"],
    },
    {
      index: {
        _id: 3,
      },
    },
    {
      accounts: ["vladimir", "donald"],
    },
  ],
});
console.log(response);

const response1 = await client.search({
  index: "emails",
  size: 0,
  aggs: {
    interactions: {
      adjacency_matrix: {
        filters: {
          grpA: {
            terms: {
              accounts: ["hillary", "sidney"],
            },
          },
          grpB: {
            terms: {
              accounts: ["donald", "mitt"],
            },
          },
          grpC: {
            terms: {
              accounts: ["vladimir", "nigel"],
            },
          },
        },
      },
    },
  },
});
console.log(response1);
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

(Обязательно, объект) Фильтры, используемые для создания корзин.

Свойства filters
<filter>

(Обязательно, объект Query DSL) Запрос, используемый для фильтрации документов. Ключ — имя фильтра.

Требуется как минимум один фильтр. Общее количество фильтров не должно превышать значение настройки indices.query.bool.max_clause_count. См. Ограничения фильтров.

separator
(Необязательно, строка) Разделитель, используемый для конкатенации имён фильтров. По умолчанию &.

Тело ответа

key
(строка) Фильтры для корзины. Если корзина использует несколько фильтров, имена фильтров конкатенируются с помощью separator.
doc_count
(целое число) Количество документов, соответствующих фильтрам корзины.

Использование

Само по себе это агрегирование может предоставить все данные, необходимые для создания неориентированного взвешенного графа. Однако при использовании с дочерними агрегациями, такими как date_histogram, результаты могут предоставить дополнительные уровни данных, необходимые для выполнения динамического анализа сетей, где важно изучение взаимодействий со временем.

Ограничения фильтров

Для N фильтров матрица создаваемых корзин может быть N²/2, что может быть дорогостоящим. Параметры разрыва цепи предотвращают создание слишком большого количества корзин, а для предотвращения избыточных обращений к диску используется значение indices.query.bool.max_clause_count для ограничения количества фильтров.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/search-aggregations-bucket-adjacency-matrix-aggregation.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API