使用Elasticsearch直方图功能,我可以放置各种范围'通过指定间隔将数据放入存储桶中。在这种情况下,' 50':
价格: 0-50 50-100 100-150 150-200 200-250 等
这样可以正常工作,但这会返回一个非常长的存储桶列表。我更喜欢的是:
0-50 50-100 100-200 200-400 400-1000 1000 +
或类似的东西。是否有可能告诉ES它应返回的间隔(/范围)?
答案 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 }
]
}
}
}
}
这应该可以满足您的期望。