我是弹性搜索的新手,我遇到了一些技术问题。目前我有以小时索引存储的文档,它们是时间序列数据。我想弄清楚的是如何有效地仅提取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个实例。感谢。
答案 0 :(得分:0)
如果我正确理解了您的问题,那么您正试图从文档中检索一个名为“key”的特定字段,并且我假设您的文档中还有其他字段正在返回,而您并不关心这些字段?
如果是这样,试试这个:
GET /_search
{
"_source": {
"includes": ["key"]
}
}
答案 1 :(得分:0)
我不确定您要实现的目标但是从文档中检索一个字段通常需要将store参数设置为true,因此不需要从_source字段解析此字段。
检查文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/number.html#number-params