分页方式
- from size 分页(存在1W数据上限限制,当然也可以释放)
- scroll 滚动查询
- search_after 分页查询
- from size 支持跳页的伪分页查询
前三种分页方式就不给出具体的实现了,这里主要讲解第四种 《from size 支持跳页的伪分页查询》文章来源地址https://www.toymoban.com/news/detail-669670.html
《from size 支持跳页的伪分页查询》
中心思想:添加查询条件
限制:必须存在唯一且有序的字段或者多个字段能够组成一个唯一且有序的条件,再加上排序
假设和需求:es 数据查询最大上限为1万条,但符合条件的数据存在5万条,需要将5万的数据分页查询出来,并且支持跳页
解:
Mapping设计:存在一个字段id,特点是自增的,对应限制条件
查询:设置size大小为200,用id asc 排序,现存数据的id是从1-50000.
以下将是模拟查询的数据,pageNumber:当前页,pageSize:每页大小,endId:每页最后一条数据的id
{pageNumber:1,pageSize:200,endId:200}
{pageNumber:2,pageSize:200,endId:400}
{pageNumber:3,pageSize:200,endId:600}
... 跳页到30 页(此时的数据量在1万以内)
{pageNumber:30,pageSize:200,endId:6000}
{pageNumber:31,pageSize:200,endId:6200}
{pageNumber:32,pageSize:200,endId:6400}
... 跳页到第60页(此时的数据量已经超过了1万)
{pageNumber:60,pageSize:200,endId:1200} >> 执行该查询时es会给出错误,此时就要启用伪分页查询
-----------------------------------------------------------------------------------------------------------------------------------------
伪分页:
我们是通过第32页直接跳转到第60页,第32页的endId为6400,且总共查询了skilTotal=32*200=6400条数据,
如果我们想要查询出第60页的数据,就必须保证符合条件的数据量小于es的可查询数量量阀值1万,
我们可以将第32页的最后一条数据的endId:6400作为查询第60页数据的条件,
注意:排序是id asc,那么我们就可以在原有的查询条件基础上添加新的条件,id>6400
此时,from=pageSize*pageNumber-skilTotal=200*60-(32*200)=5600,size=200
对应的伪dsl: {"query":{"bool":{"must":[{原来的查询条件},{"bool":{"must":[{"range":{"id":{"from":6400}}}]}}]}}}
注:此时的total会比原来的total少skilTotal条数据,so:加上skilTotal就成了
在注:用第32页的endId作为条件,我们最多能查询到第16400条数据,因此pageNumber最大为82,故:最大的跳转页=82
想要跳转到83页,必须先跳转到33页,将83页的数据包含到阀值数据内,如此往复,就完成了向右跳页查询
左跳页:
上边讲的是右跳页查询,左跳页是虚假的左跳页,实际上还是一个右跳页处理逻辑。
假设,我们目前在60页,我们想要跳转到40页,因为40页的数据在1w内,所以无需添加endId 条件
假设,我们目前在60页,我们想要跳转到59页,
我们跳转到60页时用的前置条件是32页提供的,此时我们跳转到59页,可以同样使用32页提供的前置条件。
-----------------------------------------------------------------------------------------------------------------------------------------
文章来源:https://www.toymoban.com/news/detail-669670.html
到了这里,关于elasticSearch 实现分页查询(过万跳页实现方案)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!