如何从elasticsearch索引中检索所有文档ID

时间:2014-08-26 00:55:46

标签: elasticsearch

如何从Elasticsearch索引中检索所有文档ID(内部文档'_id')?如果我在该索引中有2000万个文档,那么最好的方法是什么?

3 个答案:

答案 0 :(得分:3)

对于该数量的文档,您可能希望使用scan and scroll API

许多客户端库都有准备帮助程序来使用该接口。例如,使用elasticsearch-py,您可以执行以下操作:

es = elasticsearch.Elasticsearch(eshost)
scroll = elasticsearch.helpers.scan(es, query='{"fields": "_id"}', index=idxname, scroll='10s')
for res in scroll:
        print res['_id']

答案 1 :(得分:3)

我只想导出整个索引并读取文件系统。在处理数百万的查询结果集时,我对size / from和scan / scroll的体验一直是灾难。只需要太长时间。

如果您可以使用背包等工具,则可以将索引导出到文件系统,并遍历目录。每个文档都存储在以_id命名的自己的目录下。无需实际打开文件。只需遍历目录。

链接到背包: https://github.com/jprante/elasticsearch-knapsack

编辑:希望你不经常这样做......或者这可能不是一个可行的解决方案

答案 2 :(得分:0)

首先,您可以发出请求以获取索引中的完整记录数。

curl -X GET 'http://localhost:9200/documents/document/_count?pretty=true'

{
  "count" : 1408,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  }
}

然后,您希望使用sizefrom参数的组合来遍历整个集合,直到达到总计数。传递空field参数只会返回您感兴趣的索引和_id。

找到一个好的page大小,可以在不耗尽内存的情况下使用,并在每次迭代时增加from

curl -X GET 'http://localhost:9200/documents/document/_search?fields=&size=1000&from=5000'

示例项目响应:

{
  "_index" : "documents",
  "_type" : "document",
  "_id" : "1341",
  "_score" : 1.0
},
...