邻接矩阵聚合
编辑邻接矩阵聚合
编辑一种桶聚合,返回一种 邻接矩阵 的形式。请求提供一组命名的过滤器表达式,类似于 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>
-
(必需,查询 DSL 对象) 用于过滤文档的查询。键是过滤器名称。
至少需要一个过滤器。过滤器的总数不能超过
indices.query.bool.max_clause_count
设置。请参见 过滤器限制。
-
-
separator
- (可选,字符串) 用于连接过滤器名称的分隔符。默认为
&
。
响应主体
编辑-
key
- (字符串) 桶的过滤器。如果桶使用多个过滤器,则使用
separator
连接过滤器名称。 -
doc_count
- (整数) 匹配桶过滤器的文档数量。
用法
编辑此聚合本身可以提供创建无向加权图所需的所有数据。但是,当与子聚合(例如 date_histogram
)一起使用时,结果可以提供执行 动态网络分析 所需的其他级别的數據,其中检查随时间推移的交互变得很重要。
过滤器限制
编辑对于 N 个过滤器,生成的桶矩阵可以是 N²/2,这可能代价很高。断路器设置可以防止生成太多桶的结果,并且为了避免过多的磁盘查找,indices.query.bool.max_clause_count
设置用于限制过滤器的数量。