adjacency_matrix 聚合

返回邻接矩阵(adjacency matrix)形式的桶聚合。 该请求提供了命名过滤器表达式的集合,类似于 filters 聚合请求。 响应中的每个桶代表交叉过滤器矩阵中的一个非空单元。

给定名为ABC的过滤器,响应将返回具有以下名称的桶:

A B C

A

A

A&B

A&C

B

B

B&C

C

C

交叉的桶(例如 A&C)使用由 & 符号分隔的两个过滤器名称的组合来标记。 请注意,响应不包括“C&A”桶,因为这是与“A&C”相同的一组文档。 因为矩阵是对称的(symmetric),所以我们只返回它的一半。 为此,我们对过滤器名称字符串进行排序,并始终使用一对名称中最小的一个作为"&"分隔符左侧的值。

如果客户端希望使用默认的&符号之外的分隔符字符串,可以在请求中传递一个替代的 separator参数。

示例:

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"] }}
        }
      }
    }
  }
}

在上面的例子中,我们分析了 email 消息,以查看哪些组的个人交换了消息。 我们将获得每个组的单独计数,以及记录了交互的组对的消息计数。

响应:

{
  "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
        }
      ]
    }
  }
}

使用

这种聚合本身可以提供创建无向加权图所需的所有数据。 但是,当与子聚合(如date_histogram)一起使用时,结果可以提供执行动态网络分析所需的额外级别的数据,在这种情况下,检查一段时间内的交互变得非常重要。

Limitations

对于N个过滤器,其所产生的桶的矩阵可以是 N²/2,因此存在100个过滤器的默认最大值。 这个设置可以通过修改索引级别的设置 index.max_adjacency_matrix_filters 来改变(注意:这个设置将在 8.0版本后废除)。