【问题标题】:Elasticsearch aggregations - OR in bucketsElasticsearch 聚合 - 或在存储桶中
【发布时间】:2021-01-11 05:24:42
【问题描述】:

假设我有 5 个文档:

{
  "owner": "joe",
  "color": "black"
},
{
  "owner": "joe",
  "color": "red"
},
{
  "owner": "joe",
  "color": "blue"
},
{
  "owner": "jack",
  "color": "black"
},
{
  "owner": "jack",
  "color": "white"
}

和聚合:

{
  aggs: {
    owner: {
      "terms": {
        "field": "owner"
      }
    },
    color: {
      "terms": {
        "field": "color"
      }
    }
  }
}

按所有者和颜色汇总文档。

如果我运行匹配我得到的所有查询:

owner
joe: 3
jack: 2

color
black: 2
red: 1
blue: 1
white: 1

我想要实现的是:如果我通过 owner: joe 过滤文档,我想获得 3 个文档,其中 ownerjoe,颜色聚合:

color
black: 1
red: 1
blue: 1

但我想获得 owner 聚合:

owner
joe: 3 [selected]
jack: 2 [possible to extend]

所以得到可以选择的其他桶的数量来扩展最终结果。所以像桶之间的“或”之类的东西。

我怎样才能做到这一点?

【问题讨论】:

    标签: elasticsearch elasticsearch-aggregation


    【解决方案1】:

    实现此目的的常用方法是使用post_filter。下面的查询将返回:

    • joe 的颜色(使用filtered_colors
    • joe 的文档(使用post_filter
    • 您可以过滤的所有所有者(使用 all_owners

    查询:

    POST owners/_search
    {
      "aggs": {
        "filtered_colors": {
          "filter": {
            "term": {
              "owner.keyword": "joe"
            }
          },
          "aggs": {
            "color": {
              "terms": {
                "field": "color.keyword"
              }
            }
          }
        },
        "all_owners": {
          "terms": {
            "field": "owner.keyword"
          }
        }
      },
      "post_filter": {
        "term": {
          "owner.keyword": "joe"
        }
      }
    }
    

    【讨论】:

    • 是的,就是这样,只是想写它:) 谢谢大家的帮助!
    • 太棒了,很高兴它有帮助 ;-)
    【解决方案2】:

    据我了解,您想在ownercolor 上进行聚合(其中owner 等于joe)您可以使用filter aggregation 来实现您所需的用例-

        {
          "size": 0,
          "aggs": {
            "owner": {
              "terms": {
                "field": "owner.keyword"
              }
            },
            "filtered_aggregation": {
              "filter": {
                "term": {
                  "owner": "joe"
                }
              },
              "aggs": {
                "color": {
                  "terms": {
                    "field": "color.keyword"
                  }
                }
              }
            }
          }
        }
    

    搜索结果:

        "aggregations": {
            "owner": {
              "doc_count_error_upper_bound": 0,
              "sum_other_doc_count": 0,
              "buckets": [
                {
                  "key": "joe",
                  "doc_count": 3
                },
                {
                  "key": "jack",
                  "doc_count": 2
                }
              ]
            },
            "filtered_aggregation": {
              "doc_count": 3,
              "color": {
                "doc_count_error_upper_bound": 0,
                "sum_other_doc_count": 0,
                "buckets": [
                  {
                    "key": "black",
                    "doc_count": 1
                  },
                  {
                    "key": "blue",
                    "doc_count": 1
                  },
                  {
                    "key": "red",
                    "doc_count": 1
                  }
                ]
              }
            }
          }
    

    【讨论】:

    • 我不确定这是否满足约束I want to get 3 docs where owner is joe
    猜你喜欢
    • 2017-09-22
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    相关资源
    最近更新 更多