【问题标题】:How to efficiently get only one field of the documents for elastic search如何有效地只获取文档的一个字段进行弹性搜索
【发布时间】: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


    【解决方案1】:

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

    如果是这样,试试这个:

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

    【讨论】:

    • 我认为这行不通。我首先使用scroll 的原因是因为不建议ES 使用query 来查询大型数据集。即使可以通过 yaml 文件更改限制,我宁愿在使用普通查询作为我最后的解决方案之前寻求其他选项。
    【解决方案2】:

    我不确定您要实现什么,但从文档中检索一个字段通常需要将存储参数设置为 true,因此不需要从 _source 字段解析此字段。

    查看文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/number.html#number-params

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多