简介
官网地址:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-request-search-after.html
一般的分页需求我们可以使用form和size的方式实现,但是这种分页方式在深度分页的场景下应该是要避免使用的。深度分页会随着请求的页次增加,所消耗的内存和时间的增长也是成比例的增加,为了避免深度分页产生的问题,elasticsearch从2.0版本开始,增加了一个限制:索引设置max_result_window默认值为10,000是一个保障,搜索请求占用堆内存和时间与from size成比例。建议使用滚动Scroll api进行有效的深度滚动,但是滚动上下文开销很大,不建议将其用于实时用户请求。search_after参数提供了一个活动游标,从而绕过了这个问题。其思想是使用来自前一页的结果来帮助检索下一页。
代码语言:javascript复制index.max_result_window =10000
Search After
代码语言:javascript复制GET regroupmembers/_search
{
"size": 2,
"query": {
"match": {
"province": "山东"
}
},
"sort": [
{
"updatetime": "asc"
},
{
"_id": "asc"
}
]
}
每个文档具有一个唯一值的字段应该用作排序规范的仲裁器。否则,具有相同排序值的文档的排序顺序将是未定义的。建议的方法是使用字段_id,它肯定包含每个文档的一个唯一值。
上面的请求会为每一个文档返回一个包含sort排序值的数组。这些sort排序值可以被用于 search_after 参数里以便抓取下一页的数据。比如,我们可以使用最后的一个文档的sort排序值,将它传递给 search_after 参数:
代码语言:javascript复制GET regroupmembers/_search
{
"size": 2,
"query": {
"match": {
"province": "山东"
}
},
"search_after": [1587748455000, "6582877429_7918890798_p"],
"sort": [
{
"updatetime": "asc"
},
{
"_id": "asc"
}
]
}
注意:sort中的参数值要和search_after一一对应(数量&顺序的对应)。
当我们使用 search_after 参数的时候,from参数必须被设置成 0 或 -1 (当然你也可以不设置这个from参数)。
search_after并不是自由跳转到随机页面的解决方案,而是并行滚动许多查询。 它与滚动API非常相似,但与之不同的是,search_after参数是无状态的,始终会针对最新版本的搜索程序进行解析。 因此,排序顺序可能会在步行过程中更改,具体取决于索引的更新和删除。