分类
大数据 笔记

Elasticsearch 分页

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

发表评论

电子邮件地址不会被公开。