Elasticsearch提供两种分页,一种是使用from-size分页:
GET /_search
{
"from": 5,
"size": 20,
"query": {
"match_all": {}
}
}
from:偏移量
size:每页显示条数
ES默认情况下,使用from和size参数翻页不支持超过10000个文档,这个限制是使用索引设置的,可以设置 index.max_result_window 参数。
深度分页或一次请求许多结果可能会导致搜索缓慢。结果在返回之前先进行排序。由于搜索请求通常跨越多个分片,因此每个分片必须生成自己的排序结果。然后,必须对这些单独的结果进行合并和排序,以确保总体排序顺序正确。
作为深度分页的替代方法,官方建议使用滚动分页代替。
POST /my-index-000001/_search?scroll=1m
{
"size": 100,
"query": {
"match_all": {}
}
}
scroll=1m:代表当前查询的数据缓存1分钟
然后根据返回的scroll_id作为参数继续查询:
POST /_search/scroll
{
"scroll": "1m",
"scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}
滚动查询类似于数据库的游标,查询时返回在初始搜索请求时与搜索匹配的所有文档。它忽略了对这些文档的任何后续更改,所以滚动查询并不适合实时搜索。
滚动分页在遍历时候,拿到上一次遍历中的_scroll_id,然后带scroll参数,重复上一次的遍历步骤,直到返回的数据为空,表示遍历完成。每次都要传参数scroll,刷新搜索结果的缓存时间,另外不需要指定index和type。
scroll缓存是有开销的,除了设置自动清除,还可以手动清除:
DELETE /_search/scroll
{
"scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}
Elasticsearch官方分页文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html
发表回复