在ES中from+size 查询是有限制的,from和size两者之和不能超过1万;
原理:
第一种分页方式:from+size在ES查询数据的方式:
第一步现将用户指定的关键进行分词。
第二步将词汇去分词库中进行检索,得到多个文档的id。
第三步去各个分片中去拉取指定的数据。耗时较长。
第四步将数据根据score进行排序。耗时较长。
第五步根据from的值,将查询到的数据舍弃一部分。
第六步返回结果。
下一页的话再重复整个过程!!!
这种方式相当于limit;数据量不能过大!!!
那么,为什么数据量不能过大呢?是因为这种方式在检索的时候,会根据关键词把所有的数据都检索出来,也就是在拉取的时候耗时比较长的原因;如果数据量过大那全都是在那里浪费查询资源;举个例子,我们这一页只显示10个数据;但是我们却检索出了100万条数据,而且还要拉取这100万条数据(它拉取数据不会根据分页来,而是根据搜索来),而且多余数据再给你删掉;所以呢?如果数据量过大,这种分页方式就太浪费资源了(毕竟你只用10条数据);
第二种分页:滚动(scroll)分页
scroll+size在ES查询数据的方式
第一步现将用户指定的关键进行分词。
第二步将词汇去分词库中进行检索,得到多个文档的id。100id
第三步将文档的id存放在一个ES的上下文中。100id
第四步根据你指定的size的个数去ES中检索指定个数的数据,拿完数据的文档id,会从上下文中移除。80id
第五步如果需要下一页数据,直接去ES的上下文中,找后续内容。
第六步循环第四步和第五步;
第一步和第二步是相同的,第三步的时候他不会直接去拉取数据,而是先把检索的全部id存放在缓存中(ES 的上下文) 中;第四步它按照分页的情况去找id,然后找到id之后,再按照id去拉取数据;
声明:缓存中100万条id可比100万条数据要少的多;然后如果你拿了一部分数据,那么这些数据id会从缓存中移除;也就是:如果你第一页有10条数据,这10条数据的id就会从缓存(ES的上下文)中移除;然后当你点击下一页的时候呢,就会重复第四步,根据分页找id(也就是直接在剩下的id里面找),再根据id去拉取数据,拉取数据之后缓存中清除这部分id;
注意:Scroll查询方式,不适合做实时的查询;
为什么它不适合做实时呢? 主要是因为他把id都放到了缓存(ES的上下文)中了。如果此时数据更改了,那么缓存中的id并不会因此而改;
注意:Scroll查询也不能从中间开始看,不能从中间某一页开始查;因为它要按照顺序清除缓存的;
总结:他们的主要区别在于滚动分页scroll+size,不会一次性的拉取全部数据;另外如果下一页的话他也不会进行全部的重新查一遍;
。。。。。。。。。。。。。
嘻哈的简写笔记
。。。。。。。。。。。。。