【发布时间】:2017-10-16 20:03:07
【问题描述】:
我是 elasticsearch 新手,遇到一些技术难题。目前我有存储在每小时索引中的文档,它们是时间序列数据。我想弄清楚的是如何有效地仅提取key 字段值,该字段值定义为"key": { "type": "long" }。我最初尝试了简单的方法,即滚动所有索引并提取字段,但显然这并不能很快完成,每个小时索引大约有 10M 文档,滚动 3 个索引已经花费了很长时间。
然后我来到terms aggregations,尝试将key字段作为聚合项:
"aggregations": {
"test_group": {
"terms": {
"field": "key",
"size": 100000
}
}
}
这给了我更好的性能,但作为一个实时系统仍然不够,因为用户尝试搜索历史记录,因为key 是一个高基数字段。一些粗略的基准告诉我:
size = 50k, indices = 4, time range = 3hrs: 7.1s
size = 100k, indices = 4, time range = 3hrs: 7.669s
size = 1m, indices = 4, time range = 2hrs: 12.669s
size = 1m, indices = 4, time range = 3hrs: 14.669s
这还没有结束,因为我正在使用elastic search go library 来解析输出并进行一些处理,这为整体响应增加了重要的时间。
我的问题是:这已经是 ES 所能做的最好的了吗?还有其他我想念的方式吗?我目前在集群的 ES 5.6 和 3 个节点上,全部使用 Amazon i3-4xl 实例。谢谢。
【问题讨论】:
标签: elasticsearch go aggregation