2015-05-24 37 views
4

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

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

这工作得很好,但这返回一个相当长的名单的水桶。我宁愿是:

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

或者喜欢的东西。是否有可能告诉ES它应该返回什么间隔(/范围)?

回答

3

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

这应该给你你期待什么。

+1

这实际上回答了一个问题,而我的回答只是提供了有关如何以非直接方式使用直方图聚合的更多想法。 – tiurin

3

文档明确地说,关于该histogram aggregation

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

我能想到的是,为了降低桶的数量,你可以申请对数刻度(或任何其他非线性度,如平方根,这将使您的特定数据集足够的粒度)将值使用脚本选项:

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

这将使桶用键1,2,3,…即代表原始值的时间间隔[0内; 10),[10; 100),[100; 1000),…

通过应用反转功能(10 x在这种情况下)到客户端的密钥,您可以恢复原始比例。