前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot集成ElasticSearch时分页排序查询时遇到的坑每次只能返回10条数据

SpringBoot集成ElasticSearch时分页排序查询时遇到的坑每次只能返回10条数据

作者头像
翎野君
发布2023-07-21 19:17:00
6910
发布2023-07-21 19:17:00
举报
文章被收录于专栏:翎野君翎野君

背景

在使用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条

代码语言:javascript
复制
{
  "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字段等。

代码语言:javascript
复制
{
	"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

代码语言:javascript
复制
PUT my_index/_settings
 
{"index.max_result_window":"800000"}

之所以es默认设置最大查询量1w,与es的分布式存储和from+size的分页原理有关,可以参考之前的文章

本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。

首发链接:https://cloud.tencent.com/developer/article/2304042

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 一、查询要带上from-size
  • 查询要指定sort排序字段
  • 三、from-size分页设置窗口大小
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档