【问题标题】:Elasticsearch - optimize aggregation without count?Elasticsearch - 优化聚合而不计算?
【发布时间】:2021-02-22 21:45:09
【问题描述】:

我目前在 elasticsearch 中有一个聚合,它可以获取每个子组的计数,例如满足条件的每种颜色的计数(例如某个用户发布的项目)。

给我结果,例如:

{
   ...
   "aggregations": {
       "countPerColor": {
          "buckets": {
             "yellow": {
                "doc_count": 501
             },
             "purple": {
                "doc_count": 999
             },
             "brown": {
                "doc_count": 0
             },
          }
       }
   }
}

这比我需要的信息多,因为我不需要计数,而只需要是否存在任何信息(也就是计数 > 0)。像这样就足够了:

{
   "yellow": true,
   "purple": true,
   "brown": false
}

由于我不需要计数,有没有办法改进我的 elasticsearch 聚合(改进聚合或一些根本不需要聚合的功能)?

【问题讨论】:

    标签: elasticsearch elasticsearch-aggregation


    【解决方案1】:

    要使用聚合过滤基于doc_count 的数据,您可以使用bucket_selector pipeline aggregation.

    添加一个工作示例

    索引映射:

    {
      "mappings": {
        "properties": {
          "color": {
            "type": "keyword"
          }
        }
      }
    }
    

    索引数据:

    {
      "color": "purple"
    }
    {
      "color": "purple"
    }
    {
      "color": "yellow"
    }
    {
      "color": "yellow"
    }
    {
      "color": "yellow"
    }
    {
      "color": "brown"
    }
    

    搜索查询:

    {
      "size": 0,
      "aggs": {
        "names": {
          "terms": {
            "field": "color"
          },
          "aggs": {
            "the_filter": {
              "bucket_selector": {
                "buckets_path": {
                  "the_doc_count": "_count"
                },
                "script": "params.the_doc_count > 1"
              }
            }
          }
        }
      }
    }
    

    搜索结果:

    "aggregations": {
        "names": {
          "doc_count_error_upper_bound": 0,
          "sum_other_doc_count": 0,
          "buckets": [
            {
              "key": "yellow",
              "doc_count": 3
            },
            {
              "key": "purple",
              "doc_count": 2
            }
          ]
        }
      }
    

    【讨论】:

    • @user3861508 请仔细阅读答案,如果这能解决您的问题,请告诉我?
    • 嘿!抱歉,我的问题可能不是很清楚,但目前我已经按计数获得聚合结果。我认为您的答案是我想摆脱任何返回 0 结果的聚合,但我实际上想返回布尔值是否计数 > 0。计数也可以,但我在想,如果我只需要一个布尔值(或者如果它在找到该存储桶的任何结果后停止计数),那么我可以通过停止不必要的进一步处理来提高性能?
    猜你喜欢
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 2020-11-13
    • 2018-02-18
    • 1970-01-01
    相关资源
    最近更新 更多