在 Elasticsearch 中,默认情况下,一次查询的结果集大小受到最大结果窗口大小(默认为 10000)的限制。这意味着一次查询最多只能返回 10000 条文档。如果你想查询的结果超过 10000 条,你可以考虑以下几种方法来处理:
通过多次查询并设置不同的 from 参数(表示结果集的偏移量),将结果集分成多个分页来获取更多的结果。
from elasticsearch import Elasticsearch
es = Elasticsearch()
page_size = 1000
total_results = []
for page in range(0, 100): # Fetching 100 pages
result = es.search(
index='your_index',
body={
"size": page_size,
"from": page * page_size,
"query": {
"match_all": {}
}
}
)
hits = result['hits']['hits']
if not hits:
break
total_results.extend(hits)
使用滚动(Scroll)查询来获取大量数据。滚动查询允许你在初始查询之后继续获取结果,而不需要重新发送查询请求。
from elasticsearch import Elasticsearch
es = Elasticsearch()
scroll_time = '1m'
page_size = 1000
result = es.search(
index='your_index',
body={
"size": page_size,
"query": {
"match_all": {}
}
},
scroll=scroll_time
)
scroll_id = result['_scroll_id']
total_results = []
while True:
hits = result['hits']['hits']
if not hits:
break
total_results.extend(hits)
result = es.scroll(scroll_id=scroll_id, scroll=scroll_time)
从 Elasticsearch 7.0 开始,为了提高查询性能,推荐使用“搜索后深度分页”(Search After)来处理大量数据的分页查询。
from elasticsearch import Elasticsearch
es = Elasticsearch()
page_size = 1000
result = es.search(
index='your_index',
body={
"size": page_size,
"query": {
"match_all": {}
},
"sort": ["_doc"] # Required for Search After
}
)
total_results = []
hits = result['hits']['hits']
total_results.extend(hits)
while len(hits) == page_size:
last_sort_value = hits[-1]['sort'] # Use the last document's sort value
result = es.search(
index='your_index',
body={
"size": page_size,
"query": {
"match_all": {}
},
"search_after": last_sort_value
}
)
hits = result['hits']['hits']
total_results.extend(hits)
这些方法可以帮助你在 Elasticsearch 中处理超过 10000 条的查询结果。根据你的需求和数据量,选择适合你的方法。记得根据实际情况调整参数和代码。