如何有效地只获取文档的一个字段以进行弹性搜索

时间:2017-10-16 20:03:08

标签: elasticsearch go aggregation

我是弹性搜索的新手,我遇到了一些技术问题。目前我有以小时索引存储的文档,它们是时间序列数据。我想弄清楚的是如何有效地仅提取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个实例。感谢。

2 个答案:

答案 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

相关问题