邻接矩阵聚合编辑

一种桶聚合,返回一种 邻接矩阵 的形式。请求提供一组命名的过滤器表达式,类似于 filters 聚合请求。响应中的每个桶代表矩阵中相交过滤器的非空单元格。

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

A B C

A

A

A&B

A&C

B

B

B&C

C

C

相交的桶(例如 A&C)使用两个过滤器名称的组合进行标记,默认分隔符为 &。请注意,响应中不包含 C&A 桶,因为这将与 A&C 相同的文档集。该矩阵被称为对称矩阵,因此我们只返回它的一半。为此,我们对过滤器名称字符串进行排序,并始终使用一对中较小的值作为分隔符左侧的值。

示例编辑

以下 interactions 聚合使用 adjacency_matrix 来确定哪些个人组之间交换了电子邮件。

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
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>

(必需,查询 DSL 对象) 用于过滤文档的查询。键是过滤器名称。

至少需要一个过滤器。过滤器的总数不能超过 indices.query.bool.max_clause_count 设置。请参阅 过滤器限制

separator
(可选,字符串) 用于连接过滤器名称的分隔符。默认为 &

响应主体编辑

key
(字符串) 桶的过滤器。如果桶使用多个过滤器,则使用 separator 连接过滤器名称。
doc_count
(整数) 与桶的过滤器匹配的文档数量。

用法编辑

此聚合本身可以提供创建无向加权图所需的所有数据。但是,当与子聚合(例如 date_histogram)一起使用时,结果可以提供执行 动态网络分析 所需的额外数据级别,其中检查随时间推移的交互变得很重要。

过滤器限制编辑

对于 N 个过滤器,生成的桶矩阵可以是 N²/2,这可能很昂贵。断路器设置可以防止产生太多桶的结果,并且为了避免过多的磁盘查找,使用 indices.query.bool.max_clause_count 设置来限制过滤器的数量。