【问题标题】:Elasticsearch results limit issueElasticsearch 结果限制问题
【发布时间】:2017-06-16 23:47:12
【问题描述】:

我有一个 python 脚本,它应该打印我存储在 elasticsearch 中的 JSON 文件中的所有人员 ID。但我只得到 10 个结果(截断),因为我知道默认情况下只显示 10 个结果。

from elasticsearch import Elasticsearch
import sys
es = Elasticsearch()
res = es.search(index="my_docs", body={"query": {"match_all": {}}})
print("%d documents found" % res['hits']['total'])
for doc in res['hits']['hits']:
        print (" Doc ID: %s" % (doc['_id']))

它说找到了 5000 个文档,但只返回 10 个 ID。

从我在 Elasticsearch 中的集合中打印所有文档的 Doc ID 的方法是什么?

【问题讨论】:

  • 您的问题的标题具有误导性。当然,这不是打印错误,而是数据检索错误。

标签: python elasticsearch kibana elastic-stack kibana-5


【解决方案1】:

你需要告诉 ES 返回十多个结果(这是默认的):

body={"query": {"match_all": {}}, 'results': 1000}

对于非常大量的结果,您需要以分页的方式获取所有结果; ES 提供了执行此操作的方法。

【讨论】:

  • 谢谢!假设我想打印所有的 id,我可以使用 'results': 'all' 之类的东西吗?
  • 您可以使用'result': 10000000000000 之类的东西,但这当然会在某些时候导致内存和传输时间问题。因此,没有“全部”。并且在一个块中收集所有结果可能比在大型情况下使用提到的分页变体更昂贵。不过,5000 个元素应该还不是什么大问题。因此,如果您将 10000 作为结果限制,您的情况可能会得到解决。
  • 尝试size,以防您收到此错误RequestError: RequestError(400, 'parsing_exception', 'Unknown key for a VALUE_NUMBER in [results].')。我不确定错误是由于 elasticsearch 版本,还是因为我在进行聚合而不是简单查询。
  • 对于 elasticsearch(至少 7.6.0 及更高版本),正确的键是 'size' : 1000
  • @enrm 感谢您指出这一点。 ElasticSearch 的一个主要麻烦是他们改变了他们的界面。由于这个原因,许多较旧的答案已经过时:-(
【解决方案2】:
  1. 如果文档数超过 10000,请使用 Scroll api。
  2. 使用带限制的搜索 api 来获取指定的计数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 2016-03-24
    • 2018-05-09
    • 2018-10-08
    • 2023-03-07
    • 2015-05-07
    相关资源
    最近更新 更多