es深分页问题解决小记
from elasticsearch import Elasticsearch
def search_with_deep_paging(es, index, query, size=1000, scroll='5m'):
"""
使用Elasticsearch的滚动API进行深度分页查询
:param es: Elasticsearch客户端实例
:param index: Elasticsearch索引名
:param query: 查询体
:param size: 每批次检索的文档数量
:param scroll: 滚动时间窗口
:return: 生成器,包含匹配文档的字典
"""
# 初始化滚动搜索
res = es.search(
index=index,
body=query,
size=size,
scroll=scroll,
)
# 获取第一批次的文档
hits = res['hits']['hits']
scroll_id = res['_scroll_id']
# 循环遍历直到没有更多文档
while hits:
for hit in hits:
yield hit
# 执行下一批次的滚动搜索
res = es.scroll(
scroll_id=scroll_id,
scroll=scroll,
)
# 更新文档列表和滚动ID
hits = res['hits']['hits']
# 清除滚动ID
es.clear_scroll(scroll_id=scroll_id)
# 使用示例
es = Elasticsearch("http://localhost:9200/")
index_name = 'your_index'
query_body = {
"query": {
"match_all": {}
}
}
for hit in search_with_deep_paging(es, index_name, query_body):
print(hit)
这个代码示例展示了如何使用Elasticsearch的滚动API来处理深度分页的问题。它定义了一个search_with_deep_paging
函数,该函数接受Elasticsearch客户端、索引名、查询体以及每批次的文档数量和滚动窗口时间作为参数。函数使用Elasticsearch的滚动搜索功能来逐批获取匹配的文档,并通过生成器返回,从而节省内存。最后,提供了一个使用该函数的示例,该示例将打印所有匹配的文档。
评论已关闭