elasticsearch 深度分页查询 Search_after(图文教程)
warning:
这篇文章距离上次修改已过190天,其中的内容可能已经有所变动。
在Elasticsearch中,深度分页通常不是一个好主意,因为它会对集群的性能产生负面影响。然而,如果你确实需要进行深度分页查询,可以使用search_after
功能。search_after
是基于前一次查询返回的最后一个文档的排序值来进行查询的,从而避免了常规分页可能产生的问题。
以下是使用search_after
进行查询的基本步骤:
- 执行一个正常的查询,获取文档,但不指定分页参数(size)。
- 记录返回的文档中最后一个的sort值(排序值)。
- 在下一个查询中,将这个sort值作为
search_after
的参数。 - 重复步骤2和3,每次查询都会跳过前面已经看过的文档,直到获取到所需数量的文档。
下面是一个使用Python的Elasticsearch客户端进行search_after
查询的示例代码:
from elasticsearch import Elasticsearch
from elasticsearch import helpers
# 连接到Elasticsearch
es = Elasticsearch("http://localhost:9200")
# 查询的索引
index_name = 'your_index'
# 查询的sort值,初始化为None
search_after = None
# 查询的大小
size = 10
# 查询体
query = {
"query": {
"match_all": {}
},
"sort": ["_id"] # 假设我们根据_id排序
}
# 使用search_after进行分页
while True:
# 如果这是第一次查询,initial_search_after应为None
if search_after is None:
initial_search_after = None
else:
initial_search_after = search_after
# 执行搜索
response = es.search(
index=index_name,
size=size,
body=query,
search_after=initial_search_after
)
# 获取文档
documents = response['hits']['hits']
# 检查是否已经获取了所有文档
if len(documents) == 0:
break
# 更新search_after的值
search_after = documents[-1]['sort']
# 处理文档
for doc in documents:
print(doc)
# 这里可以添加退出循环的条件,例如达到所需的文档数量
# 如果满足条件则跳出循环,否则继续下一轮查询
请注意,这个例子假设你根据_id
字段排序,并且每个文档的_id
是唯一的。在实际应用中,你需要根据你的索引的实际情况来调整查询体中的sort
字段和查询参数。
评论已关闭