邻接矩阵聚合

编辑

一种桶聚合,返回一种 邻接矩阵 的形式。请求提供一组命名的过滤器表达式,类似于 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 来确定哪些个人群组交换了电子邮件。

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>

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

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

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

响应主体

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

用法

编辑

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

过滤器限制

编辑

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