弹性搜索直方图,多个区间类型?

时间:2015-05-24 15:14:04

标签: elasticsearch

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

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

这样可以正常工作,但这会返回一个非常长的存储桶列表。我更喜欢的是:

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

或类似的东西。是否有可能告诉ES它应返回的间隔(/范围)?

2 个答案:

答案 0 :(得分:4)

文档明确说明了histogram aggregation

  

它在值上动态构建固定大小(a.k.a.interval)存储桶。

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

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

这将为桶提供密钥1,2,3,...代表区间[0; 10),[10; 100),[100; 1000],...中的原始值,...

通过将反向功能(在这种情况下为10 x )应用于客户端的键,您可以恢复原始比例。

答案 1 :(得分:4)

您需要使用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 }
                ]
            }
        }
    }
}

这应该可以满足您的期望。