SpringBoot集成ElasticSearch时分页排序查询时遇到的坑每次只能返回10条数据
背景
在使用ElasticSearch来分词查询,并分页返回指定的数据条数,但是当我们每次想得到分页数据条数超过十条的时候,ElasticSearch总是只能返回十条。这是因为ElasticSearch为了查询的速度,在默认的情况下已经设置了分页数据只能返回10条,所以我们需要通过改变size(返回数据的大小)去改变分页查询的数据条数大小,若没有设置size只能是返回10条。
一、查询要带上from-size
在es中query查询如果不指定from-size值,es默认from=0,size=10,默认一次查询10条数据
如下查询语句,11个唯一id查询,如果不指定from,size,只返回10条数据,而不是11条
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | { "query" : { "bool" : { "must" : [ { "terms" : { "id" : [ 4190 , 4191 , 4192 , 4193 , 4194 , 4195 , 4196 , 4197 , 4198 , 4199 , 4200 ] } } ] } }, "sort" : [ { "created_time" : { "order" : "desc" } } ] } |
所以正确的查询是加上from=0,size=11,即指定预期的size。
查询要指定sort排序字段
在es中query查询如果不指定sort排序字段,翻页查询,可能会出现重复查询,分页混乱问题。
如下,每页查询10条,查询多页,可能会有重复的数据返回,此时查询要sort排序字段,尽可能的唯一,如创建时间或者主键、唯一ID字段等。
1 2 3 4 5 6 7 8 9 10 11 12 13 | { "from" : 0 , "size" : 10 , "query" : { "bool" : { "must" : [{ "term" : { "month" : "2022-12" } }] } } } |
总体来说,这是由于 ES 的分片存储与分片检索机制导致的。一个常见的原因就是ES的_score评分引起的。ES默认的排序,恰恰就是按 _score倒序。 在全部doc的_score 都是0分的时候,分页就会错乱,有时候出现在第一页的结果很可能会重复出现在第二页,第三页 (取决于当时shards 返回的结果的顺序)。
三、from-size分页设置窗口大小
如果初次使用且对es不熟悉的话,当from + size分页查询超过10000时候,会报如下异常:
Result window is too large, from + size must be less than or equal to: [10000] but was [22020]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting
上边 from+size=(pageNum-1)*size+size=(1101-1)*20+20=22020>10000,抛出了异常
当然10000也可以调整,如最大上限调整为800000
1 2 3 | PUT my_index/_settings { "index.max_result_window" : "800000" } |
之所以es默认设置最大查询量1w,与es的分布式存储和from+size的分页原理有关,可以参考之前的文章
本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。
出处:http://www.cnblogs.com/lingyejun/
若本文如对您有帮助,不妨点击一下右下角的【推荐】。
如果您喜欢或希望看到更多我的文章,可扫描二维码关注我的微信公众号《翎野君》。
转载文章请务必保留出处和署名,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2017-07-18 Tomcat内部结构及请求原理(转)
2017-07-18 Tomcat环境搭建