deep paging:
简单来说,就是搜索特别深,比如总共有60000条数据,每个shard分了20000条数据,每页10条,要搜索到第1000页,所以每个shard都要将第10001~10010条返回给coordinate node,然后coordinate node收到总共30003条数据,然后在这些数据中排序,_score,相关度分数,然后取到排位最高的前10条,也就是我们最后要的第1000页的10条数据。
性能问题:
将大量数据排序,耗费网络带宽,耗费内存,耗费CPU,所以要避免deep paging操作。
1 基于scroll滚动搜索(失效时间很难搞):
GET /test_index/test_type/_search?scroll=1m
{
“query”: {
“match_all”: {}
},
“sort”: [ “_doc” ],
“size”: 3
}
执行以上语句,可以得到以下结果:
{"_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAACxeFjRvbnNUWVZaVGpHdklqOV9zcFd6MncAAAAAAAAsYBY0b25zVFlWWlRqR3ZJajlfc3BXejJ3AAAAAAAALF8WNG9uc1RZVlpUakd2SWo5X3NwV3oydwAAAAAAACxhFjRvbnNUWVZaVGpHdklqOV9zcFd6MncAAAAAAAAsYhY0b25zVFlWWlRqR3ZJajlfc3BXejJ3","took": 5,"timed_out": false,"_shards": {"total": 5,"successful": 5,"failed": 0},"hits": {"total": 10,"max_score": null,"hits": [{"_index": "test_index","_type": "test_type","_id": "8","_score": null,"_source": {"test_field": "test client 2"},"sort": [0]},{"_index": "test_index","_type": "test_type","_id": "6","_score": null,"_source": {"test_field": "tes test"},"sort": [0]},{"_index": "test_index","_type": "test_type","_id": "AVp4RN0bhjxldOOnBxaE","_score": null,"_source": {"test_content": "my test"},"sort": [0]}]}}
获得的结果有一个scroll_id,下次再发送scroll请求时,必须带上这个scroll_id,
GET /test_index/test_type/_search/scroll{"scroll": "1m","scroll_id" : "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAACxeFjRvbnNUWVZaVGpHdklqOV9zcFd6MncAAAAAAAAsYBY0b25zVFlWWlRqR3ZJajlfc3BXejJ3AAAAAAAALF8WNG9uc1RZVlpUakd2SWo5X3NwV3oydwAAAAAAACxhFjRvbnNUWVZaVGpHdklqOV9zcFd6MncAAAAAAAAsYhY0b25zVFlWWlRqR3ZJajlfc3BXejJ3"}
2 避免 深度分页
只让查看前8000页
百度只让看76页

3 Search After
https://www.cnblogs.com/sanduzxcvbnm/p/12085212.html
ES分页时使用scroll机制可以解决深分页问题,但是对于实时性要求不高的场景可以使用该机制,但是如果对于增删改操作之后,需要立刻反应在结果集中,该方式不是很适合。这时可以使用ES5.x之后提供的另外一个机制,即:search_after机制。
search_after机制的原理:
① 首先为每个文档生成一个全局唯一的标识id;
② 根据上一页的最后一条结果来确定下一页数据的位置,在搜索下一页时,需要将上一页的最后一条数据的唯一标识id带着。
该机制的优点:对于数据的增删改可以快速反应在搜索结果中,不会存在着太大的延迟;
至此,ES的分页用法及分页过程中的深分页问题及解决方案介绍完毕。本篇文章中理论描述总结较多,下篇文章将会通过实际示例来介绍ES深分页的解决方案。欢迎转发该文章!
