【问题标题】:Elasticsearch histogram, multiple interval types?Elasticsearch直方图,多种区间类型?
【发布时间】:2015-05-25 11:41:20
【问题描述】:

使用 Elasticsearch 直方图功能,我可以通过指定间隔将各种“范围”的数据放入存储桶中。在这种情况下为“50”:

价格: 0-50 50-100 100-150 150-200 200-250 等等

这很好用,但是这会返回一个非常长的存储桶列表。我更喜欢的是:

0-50 50-100 100-200 200-400 400-1000 1000+

或类似的东西。是否可以告诉 ES 应该返回什么区间(/ranges)?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您需要使用numeric range 聚合,它允许您准确指定所需的间隔,例如:

    {
        "aggs" : {
            "price_ranges" : {
                "range" : {
                    "field" : "price",
                    "ranges" : [
                        { "to" : 50 },
                        { "from" : 50, "to" : 100 },
                        { "from" : 100, "to": 200 },
                        { "from" : 200, "to": 400 },
                        { "from" : 400, "to": 1000 },
                        { "from" : 1000 }
                    ]
                }
            }
        }
    }
    

    这应该完全符合您的期望。

    【讨论】:

    • 这实际上回答了一个问题,而我的回答只是给出了更多关于如何以非直接方式使用直方图聚合的想法。
    【解决方案2】:

    文档明确提到histogram aggregation

    它在值上动态构建固定大小(也称为间隔)桶。

    我能想到的是,为了减少存储桶的数量,您可以使用脚本选项对值应用对数刻度(或任何其他非线性刻度,例如平方根,这将为您的特定数据集提供足够的粒度) :

    {
        "aggs": {
            "prices": {
                "histogram": {
                    "field": "price",
                    "script": "Math.log10(_value)",
                    "interval": 1
                }
            }
        }
    }
    

    这将给出带有键 1、2、3...的桶,它们代表区间 [0;10)、[10;100)、[100;1000)、...内的原始值。

    通过对客户端的键应用反向函数(在本例中为 10x),您可以恢复原始比例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多