嵌套的术语聚合,聚合兄弟姐妹

问题描述 投票:0回答:1

不太确定如何形成这个问题,所以我将跳到一个例子中。假设我有以下文件:

{
    elements: [
        {name: 'foo'},
        {name: 'bar'},
        {name: 'baz'}
    ]
},
{
    elements: [
        {name: 'foo'},
        {name: 'baz'}
    ]  
}

其中elements包含嵌套文档。我希望能够聚合每个name并获得兄弟姐妹与该元素出现的次数。

{
    foo: {
        bar: 1,
        baz: 2
    },
    bar: {
        foo: 1,
        baz: 1
    },
    baz: {
        foo: 2,
        bar: 1
    }
}

有没有一种巧妙的方法来使用elasticsearch聚合来做到这一点?我对ES中聚合的原始理解让我做了类似的事情:

"aggs": {
    "elements": {
        "nested": {
            "path": "elements"
        },
        "aggs": {
            "names": {
                "terms": {
                    "field": "elements.name",
                    "size": 20
                },
                "aggs": {
                    "more_elements": {
                        "terms": {
                            "field": "elements.name",
                            "size": 20
                        }
                    }
                }
            }
        }
    }
}

这给出了完全错误的结果。我最终得到了类似的东西:

{
    foo: {
        doc_count: 2, 
        foo: 2
    },
    bar: {
        doc_count: 1, 
        foo: 1
    },
    baz: {
        doc_count: 2, 
        foo: 2
    }
}

任何帮助深表感谢!我目前正在使用ES 5.4,如果这很重要的话。

elasticsearch
1个回答
0
投票

找不到一步到位的方法。我将它分为两​​步:

第1步:找到所有elements.names:

{
  "size": 0,
  "aggs": {
    "elements": {
      "nested": {
        "path": "elements"
      },
      "aggs": {
        "names": {
          "terms": {
            "field": "elements.name",
            "size": 20
          }
        }
      }
    }
  }
}

第2步:为每个element.name做:

{
  "size": 0,
  "aggs": {
    "bool_agg": {
      "filter": {
        "bool": {
          "must": {
            "term": {
              "elements.name": "NAME_HERE"
            }
          }
        },
        "aggs": {
          "names": {
            "terms": {
              "field": "elements.name",
              "size": 20
            }
          }
        }
      }
    }
  }
}

请注意我在这里不使用嵌套聚合 - filter aggregation会过滤包含当前名称的每个(完整)文档。我只是得到每个兄弟的出现次数(以及当前的名字 - 但它也可以删除)。

© www.soinside.com 2019 - 2024. All rights reserved.