一、from + size 浅分页

"浅"分页能够了解为简略意义上的分页。

它的原理很简略,就是查问前20条数据,而后截断前10条,只返回10-20的数据。这样其实白白浪费了前10条的查问。

GET test_dev/_search{  "query": {    "bool": {      "filter": [        {          "term": {            "age": 28          }        }      ]    }  },  "size": 10,  "from": 20,  "sort": [    {      "timestamp": {        "order": "desc"      },      "_id": {        "order": "desc"      }    }  ]}

其中,from定义了指标数据的偏移值,size定义以后返回的数目。默认from为0,size为10,即所有的查问默认仅仅返回前10条数据。

在这里有必要理解一下from/size的原理:

因为es是基于分片的,假如有5个分片,from=100,size=10。则会依据排序规定从5个分片中各取回100条数据数据,而后汇总成500条数据后抉择最初面的10条数据。

做过测试,越往后的分页,执行的效率越低。总体上会随着from的减少,耗费工夫也会减少。而且数据量越大,就越显著!

二、scroll 深分页

from+size查问在10000-50000条数据(1000到5000页)以内的时候还是能够的,然而如果数据过多的话,就会呈现深分页问题。

为了解决下面的问题,elasticsearch提出了一个scroll滚动的形式。

scroll 相似于sql中的cursor,应用scroll,每次只能获取一页的内容,而后会返回一个scroll_id。依据返回的这个scroll_id能够一直地获取下一页的内容,所以scroll并不适用于有跳页的情景。

GET test_dev/_search?scroll=5m{  "query": {    "bool": {      "filter": [        {          "term": {            "age": 28          }        }      ]    }  },  "size": 10,  "from": 0,  "sort": [    {      "timestamp": {        "order": "desc"      },      "_id": {        "order": "desc"      }    }  ]}
  • scroll=5m示意设置scroll_id保留5分钟可用。
  • 应用scroll必须要将from设置为0。
  • size决定前面每次调用_search搜寻返回的数量

而后咱们能够通过数据返回的_scroll_id读取下一页内容,每次申请将会读取下10条数据,直到数据读取结束或者scroll_id保留工夫截止:

GET _search/scroll{  "scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAJZ9Fnk1d......",  "scroll": "5m"}

留神:申请的接口不再应用索引名了,而是 _search/scroll,其中GET和POST办法都能够应用。

scroll删除

依据官网文档的说法,scroll的搜寻上下文会在scroll的保留工夫截止后主动革除,然而咱们晓得scroll是十分耗费资源的,所以一个倡议就是当不须要了scroll数据的时候,尽可能快的把scroll_id显式删除掉。

革除指定的scroll_id

DELETE _search/scroll/DnF1ZXJ5VGhlbkZldGNo.....

革除所有的scroll:

DELETE _search/scroll/_all

三、search_after 深分页

scroll 的形式,官网的倡议不用于实时的申请(个别用于数据导出),因为每一个 scroll_id 不仅会占用大量的资源,而且会生成历史快照,对于数据的变更不会反映到快照上。

search_after 分页的形式是依据上一页的最初一条数据来确定下一页的地位,同时在分页申请的过程中,如果有索引数据的增删改查,这些变更也会实时的反映到游标上。然而须要留神,因为每一页的数据依赖于上一页最初一条数据,所以无奈跳页申请。

为了找到每一页最初一条数据,每个文档必须有一个全局惟一值,官网举荐应用 _uid 作为全局惟一值,其实应用业务层的 id 也能够。

GET test_dev/_search{  "query": {    "bool": {      "filter": [        {          "term": {            "age": 28          }        }      ]    }  },  "size": 20,  "from": 0,  "sort": [    {      "timestamp": {        "order": "desc"      },      "_id": {        "order": "desc"      }    }  ]}
  • 应用search_after必须要设置from=0
  • 这里我应用timestamp和_id作为惟一值排序。
  • 咱们在返回的最初一条数据里拿到sort属性的值传入到search_after

应用sort返回的值搜寻下一页:

GET test_dev/_search{  "query": {    "bool": {      "filter": [        {          "term": {            "age": 28          }        }      ]    }  },  "size": 10,  "from": 0,  "search_after": [    1541495312521,    "d0xH6GYBBtbwbQSP0j1A"  ],  "sort": [    {      "timestamp": {        "order": "desc"      },      "_id": {        "order": "desc"      }    }  ]}

你都学会了吗?

版权申明:本文为CSDN博主「zhexiao27」的原创文章,遵循CC 4.0 BY-SA版权协定,转载请附上原文出处链接及本申明。原文链接:https://blog.csdn.net/andybeg...

近期热文举荐:

1.1,000+ 道 Java面试题及答案整顿(2022最新版)

2.劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4.别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!

5.《Java开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞+转发哦!