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
}
执行以上语句,可以得到以下结果:

  1. {
  2. "_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAACxeFjRvbnNUWVZaVGpHdklqOV9zcFd6MncAAAAAAAAsYBY0b25zVFlWWlRqR3ZJajlfc3BXejJ3AAAAAAAALF8WNG9uc1RZVlpUakd2SWo5X3NwV3oydwAAAAAAACxhFjRvbnNUWVZaVGpHdklqOV9zcFd6MncAAAAAAAAsYhY0b25zVFlWWlRqR3ZJajlfc3BXejJ3",
  3. "took": 5,
  4. "timed_out": false,
  5. "_shards": {
  6. "total": 5,
  7. "successful": 5,
  8. "failed": 0
  9. },
  10. "hits": {
  11. "total": 10,
  12. "max_score": null,
  13. "hits": [
  14. {
  15. "_index": "test_index",
  16. "_type": "test_type",
  17. "_id": "8",
  18. "_score": null,
  19. "_source": {
  20. "test_field": "test client 2"
  21. },
  22. "sort": [
  23. 0
  24. ]
  25. },
  26. {
  27. "_index": "test_index",
  28. "_type": "test_type",
  29. "_id": "6",
  30. "_score": null,
  31. "_source": {
  32. "test_field": "tes test"
  33. },
  34. "sort": [
  35. 0
  36. ]
  37. },
  38. {
  39. "_index": "test_index",
  40. "_type": "test_type",
  41. "_id": "AVp4RN0bhjxldOOnBxaE",
  42. "_score": null,
  43. "_source": {
  44. "test_content": "my test"
  45. },
  46. "sort": [
  47. 0
  48. ]
  49. }
  50. ]
  51. }
  52. }

获得的结果有一个scroll_id,下次再发送scroll请求时,必须带上这个scroll_id,

  1. GET /test_index/test_type/_search/scroll
  2. {
  3. "scroll": "1m",
  4. "scroll_id" : "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAACxeFjRvbnNUWVZaVGpHdklqOV9zcFd6MncAAAAAAAAsYBY0b25zVFlWWlRqR3ZJajlfc3BXejJ3AAAAAAAALF8WNG9uc1RZVlpUakd2SWo5X3NwV3oydwAAAAAAACxhFjRvbnNUWVZaVGpHdklqOV9zcFd6MncAAAAAAAAsYhY0b25zVFlWWlRqR3ZJajlfc3BXejJ3"
  5. }

2 避免 深度分页

只让查看前8000页

百度只让看76页

image.png

3 Search After

https://www.cnblogs.com/sanduzxcvbnm/p/12085212.html

ES分页时使用scroll机制可以解决深分页问题,但是对于实时性要求不高的场景可以使用该机制,但是如果对于增删改操作之后,需要立刻反应在结果集中,该方式不是很适合。这时可以使用ES5.x之后提供的另外一个机制,即:search_after机制。

search_after机制的原理:
① 首先为每个文档生成一个全局唯一的标识id;
② 根据上一页的最后一条结果来确定下一页数据的位置,在搜索下一页时,需要将上一页的最后一条数据的唯一标识id带着。

该机制的优点:对于数据的增删改可以快速反应在搜索结果中,不会存在着太大的延迟;
至此,ES的分页用法及分页过程中的深分页问题及解决方案介绍完毕。本篇文章中理论描述总结较多,下篇文章将会通过实际示例来介绍ES深分页的解决方案。欢迎转发该文章!