分页查询大概分为3个。
from size
search_after
scroll search
在日志/指标/全文检索的世界里,数据量往往巨大。如何高效、安全地翻页获取结果,是每个开发/运维都必须掌握的技能。本文用最少的理论、最多的实战,带你掌握 OpenSearch(Elasticsearch 兼容)中三大分页套路,告诉你什么时候用哪种、怎么写、哪些坑不能踩——读完就能上手实战。
|
|
|
|
|
|---|---|---|---|
from + size |
|
max_result_window 限制(默认 10000)
|
|
search_after |
from 限制
|
@timestamp + _id),必须用上一次最后一条的 sort 值
|
|
scroll |
|
|
|
GET my-index/_search
{
"from": 0,
"size": 20,
"query": { "match_all": {} },
"sort": [{ "@timestamp": "desc" }]
}
注意:
from+size<=index.max_result_window(默认 10000)。深度翻页会触发Result window is too large错误。from越大性能越差,因为底层需要跳过大量文档。
第一次查询:
GET my-index/_search
{
"size": 100,
"query": { "match_all": {} },
"sort": [
{ "@timestamp": "asc" },
{ "_id": "asc" }
]
}
第二次查询:
GET my-index/_search
{
"size": 100,
"query": { "match_all": {} },
"sort": [
{ "@timestamp": "asc" },
{ "_id": "asc" }
],
"search_after": [1697000000000, "abc123"]
}
注意:
search_after 需要客户端保存上页最后一条的 sort 值。
若排序字段在索引中类型不一致(多索引查询),会报错——确保 mapping 一致。
search_after 不受 max_result_window 限制。
scroll(快照式遍历)
第一次请求:开启快照(例如 scroll=5m)并返回第一批数据与 _scroll_id。
后续请求:使用 _search/scroll POST body 提交 scroll_id 和 scroll 值获取下一批。
第一次查询:
GET my-index/_search?scroll=1m
{
"size": 100,
"query": { "match_all": {} },
"sort": [
{ "@timestamp": "asc" },
{ "_id": "asc" }
]
}
GET/_search/scroll

