2017-10-16 68 views
0

我是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实例。谢谢。

回答

0

如果我正确理解您的问题,您正在尝试从您的文档中检索一个名为'key'的特定字段,并且我假设您的文档中还有其他字段正在返回,而您并不在意?

如果是的话,试试这个:

GET /_search 
{ 
    "_source": { 
     "includes": ["key"] 
    } 
} 
+0

我不认为这会工作。我首先使用'scroll'的原因是因为不推荐使用'query'来查询大型数据集。即使可以通过yaml文件更改限制,但在使用普通查询作为我最后的解决方案之前,我宁愿寻求其他选项。 –