如何使用Python客户端获取Elasticsearch索引下所有文档?代码仅返回首个文档
问题出在这儿!
嘿,我一眼就瞅见你代码里的关键问题了——你在for循环内部用了return语句!这会导致函数刚处理完第一个文档就直接返回结果,后面的文档根本没机会被遍历,所以你只能看到第一条数据。
修正后的基础版本代码
如果你的需求是返回所有文档的_id、_source['0']和_source['5']内容,应该先把所有结果收集到一个列表里,最后统一返回:
def get_all_es_docs(es): # 执行查询,注意ES高版本要去掉doc_type参数 res = es.search( index="92c603b3-8173-4d7a-9aca-f8c115ff5a18", doc_type="doc", # Elasticsearch 7.x及以后版本请删除此行 body={'size': 10000, 'query': {'match_all': {}}} ) # 适配不同ES版本的总文档数获取方式 total_docs = res['hits']['total']['value'] if isinstance(res['hits']['total'], dict) else res['hits']['total'] print(f"{total_docs} documents found") result = [] # 遍历所有命中的文档 for doc in res['hits']['hits']: print(doc) # 将当前文档的信息加入结果列表 doc_info = f"{doc['_id']} {doc['_source']['0']} {doc['_source']['5']}" result.append(doc_info) # 最后一次性返回所有结果 return result
额外提醒与进阶方案
- ES版本兼容:如果你的Elasticsearch是7.x及以上版本,
doc_type参数已经被废弃,必须删除这个参数,否则会抛出错误。 - 超10000条文档的处理:如果你的索引里文档数量超过10000条,
size:10000只能拿到前10000条,这时候需要用**滚动查询(scroll)**来获取全部文档,示例代码如下:
def scroll_get_all_docs(es): scroll_timeout = '2m' # 设置滚动上下文的超时时间 # 初始化滚动查询 init_res = es.search( index="92c603b3-8173-4d7a-9aca-f8c115ff5a18", # doc_type="doc", # 高版本删除此行 body={'size': 10000, 'query': {'match_all': {}}}, scroll=scroll_timeout ) scroll_id = init_res['_scroll_id'] # 适配不同ES版本的总文档数获取方式 total_docs = init_res['hits']['total']['value'] if isinstance(init_res['hits']['total'], dict) else init_res['hits']['total'] print(f"{total_docs} documents found") result = [] # 处理第一批结果 for doc in init_res['hits']['hits']: result.append(f"{doc['_id']} {doc['_source']['0']} {doc['_source']['5']}") # 循环滚动获取剩余文档 while len(init_res['hits']['hits']) > 0: init_res = es.scroll(scroll_id=scroll_id, scroll=scroll_timeout) scroll_id = init_res['_scroll_id'] for doc in init_res['hits']['hits']: result.append(f"{doc['_id']} {doc['_source']['0']} {doc['_source']['5']}") # 记得清理滚动上下文,避免资源浪费 es.clear_scroll(scroll_id=scroll_id) return result
这样就能完整获取所有文档的内容啦!
内容的提问来源于stack exchange,提问作者J.Ghassen
相关产品推荐
相关产品推荐

