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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 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条

{
  "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字段等。

{
  "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

PUT my_index/_settings
{"index.max_result_window":"800000"}

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

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


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
12天前
|
消息中间件 Java Kafka
Springboot集成高低版本kafka
Springboot集成高低版本kafka
|
19天前
|
NoSQL Java Redis
SpringBoot集成Redis解决表单重复提交接口幂等(亲测可用)
SpringBoot集成Redis解决表单重复提交接口幂等(亲测可用)
51 0
|
24天前
|
关系型数据库 MySQL
elasticsearch对比mysql以及使用工具同步mysql数据全量增量
elasticsearch对比mysql以及使用工具同步mysql数据全量增量
20 0
|
1月前
|
JSON JavaScript 前端开发
解决js中Long类型数据在请求与响应过程精度丢失问题(springboot项目中)
解决js中Long类型数据在请求与响应过程精度丢失问题(springboot项目中)
33 0
|
23天前
|
NoSQL Java Redis
SpringBoot集成Redis
SpringBoot集成Redis
159 0
|
30天前
|
NoSQL Java Redis
小白版的springboot中集成mqtt服务(超级无敌详细),实现不了掐我头!!!
小白版的springboot中集成mqtt服务(超级无敌详细),实现不了掐我头!!!
234 1
|
3天前
|
机器学习/深度学习
R语言集成模型:提升树boosting、随机森林、约束最小二乘法加权平均模型融合分析时间序列数据
R语言集成模型:提升树boosting、随机森林、约束最小二乘法加权平均模型融合分析时间序列数据
10 0
|
11天前
|
缓存 前端开发 Java
SpringBoot启动后加载初始化数据
SpringBoot启动后加载初始化数据
|
12天前
|
SQL Java 调度
SpringBoot集成quartz定时任务trigger_state状态ERROR解决办法
SpringBoot集成quartz定时任务trigger_state状态ERROR解决办法
|
19天前
|
NoSQL Java Redis
SpringBoot集成Redis
SpringBoot集成Redis
41 1