【Elasticsearch】 邻接矩阵聚合(Adjacency Matrix Aggregation)
Elasticsearch 的邻接矩阵聚合(Adjacency Matrix Aggregation)是一种特殊的桶聚合,用于分析多个过滤器之间的交集关系。它可以帮助你快速了解哪些文档同时满足多个条件,并统计每个交集的文档数量。这种聚合特别适用于分析复杂的关系网络,例如社交网络中的用户交互、事件之间的关联等。
核心概念
1. 过滤器(Filters):
邻接矩阵聚合通过一组命名的过滤器来定义不同的条件。每个过滤器可以是一个简单的查询,例如`term`、`terms`或`range`查询,用于筛选满足特定条件的文档。
2. 交集(Intersections):
邻接矩阵聚合会计算所有过滤器之间的交集。例如,如果有过滤器`A`和`B`,它会计算同时满足`A`和`B`的文档数量。
3. 对称性(Symmetry):
邻接矩阵是对称的,即`A&B`和`B&A`是相同的交集。因此,聚合结果只返回一半的交集,避免重复。
4. 结果(Buckets):
每个交集被表示为一个桶(bucket),每个桶包含一个键(key)和一个文档计数(doc_count)。键是过滤器名称的组合,例如`A&B`。
示例说明
假设我们有一个索引`emails`,其中记录了不同用户之间的电子邮件往来。我们希望分析哪些用户群体之间有邮件交互。
示例数据
```json
PUT emails/_bulk?refresh
{ "index" : { "_id" : 1 } }
{ "accounts" : ["hillary", "sidney"]}
{ "index" : { "_id" : 2 } }
{ "accounts" : ["hillary", "donald"]}
{ "index" : { "_id" : 3 } }
{ "accounts" : ["vladimir", "donald"]}
```
查询
```json
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"] }}
}
}
}
}
}
```
查询解析
1. `size: 0`:
表示我们不需要返回具体的文档内容,只关心聚合结果。
2. `aggs`:
定义聚合操作,名称为`interactions`。
3. `adjacency_matrix`:
指定聚合类型为邻接矩阵聚合。
4. `filters`:
定义了三个过滤器:
• `grpA`:匹配`accounts`字段中包含`hillary`或`sidney`的文档。
• `grpB`:匹配`accounts`字段中包含`donald`或`mitt`的文档。
• `grpC`:匹配`accounts`字段中包含`vladimir`或`nigel`的文档。
5. 交集计算:
邻接矩阵聚合会计算以下交集:
• `grpA`:只满足`grpA`的文档数量。
• `grpB`:只满足`grpB`的文档数量。
• `grpC`:只满足`grpC`的文档数量。
• `grpA&grpB`:同时满足`grpA`和`grpB`的文档数量。
• `grpB&grpC`:同时满足`grpB`和`grpC`的文档数量。
响应示例
```json
{
"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
}
]
}
}
}
```
响应解析
• `key`:表示过滤器的组合,例如`grpA`、`grpA&grpB`等。
• `doc_count`:表示满足该过滤器组合的文档数量。
应用场景
1. 社交网络分析:
分析用户之间的交互关系,例如哪些用户群体之间有频繁的互动。
2. 事件关联分析:
分析不同事件之间的关联,例如哪些事件经常同时发生。
3. 用户行为分析:
分析用户在不同场景下的行为模式,例如哪些用户同时访问了多个特定页面。
注意事项
1. 性能问题:
邻接矩阵聚合的复杂度较高,尤其是当过滤器数量较多时(\(N^2/2\)个桶)。建议合理限制过滤器的数量,避免过多的计算开销。
2. 断路器保护:
Elasticsearch 提供了断路器机制,防止聚合查询生成过多的桶,从而导致内存溢出或性能问题。
3. 结果对称性:
由于邻接矩阵是对称的,查询结果只返回一半的交集,避免重复。
通过邻接矩阵聚合,你可以高效地分析和可视化复杂的交互关系,为数据驱动的决策提供有力支持。