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的分页原理有关,可以参考之前的文章

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

首发链接:https://www.cnblogs.com/lingyejun/p/17557526.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot 集成 Elasticsearch ,如果遇到转义字符查询不出现的问题,可能是因为你的查询语句中使用了转义字符,但是 Elasticsearch 没有正确地处理它们。 解决方法有以下几种: 1. 在查询语句中使用原始字符串,而不是转义字符。 2. 使用 Elasticsearch 的 query_string 查询。 3. 使用 Elasticsearch 提供的特殊字符转义机制。 4. 在 Elasticsearch 的映射中配置字段为 keyword 类型,这样查询就不会进行分词,避免了转义字符的问题。 5. 使用 Elasticsearch 的 filter 进行过滤,而不是 query 进行查询. ### 回答2: 在Spring Boot集成Elasticsearch,当遇到一些特殊字符可能会出现查询不出来的情况,主要的原因是这些字符在查询语句中需要进行转义处理。 在Elasticsearch中,一些特殊字符或具有特殊意义的字符需要进行转义,包括但不限于以下情况: 1. 特殊字符:例如加号(+)、减号(-)、逗号(,)、冒号(:)等,在查询需要对这些字符进行转义,可以使用反斜杠(\)进行转义。 例如,如果想要查询包含加号(+)的文档,可以使用如下查询语句: ``` GET /index/_search { "query": { "match_phrase": { "field": "\\+" } } } ``` 2. 保留字符:Elasticsearch中有一些保留字符,例如AND、OR、NOT等,这些字符在查询需要进行转义。可以使用双引号("")将这些字符包裹起来进行转义。 例如,如果想要查询包含"AND"的文档,可以使用如下查询语句: ``` GET /index/_search { "query": { "match_phrase": { "field": "\"AND\"" } } } ``` 需要注意的是,在进行转义,要根据查询的具体字段类型和实际需求进行适当的转义处理,以确保查询的准确性。另外,还可以根据具体情况使用正则表达式查询或其他查询方式来解决特殊字符查询不出来的问题。 ### 回答3: 在Spring Boot集成Elasticsearch中,有候会遇到一些特殊字符的查询问题。这些特殊字符经常被称为转义字符,用于在搜索过程中指定特定的匹配规则。 普通数据查询很简单,可以直接使用Elasticsearch查询API进行查询。但是对于包含转义字符的查询,需要特殊处理。 一种常见的情况是查询含有通配符的字符,比如*、?等。Elasticsearch默认会将这些字符视为正则表达式的特殊字符,而不是普通字符。为了正确查询这些字符,可以使用转义字符\来取消其特殊含义,比如将*转义为\*。 另一种情况是查询含有特殊字符的字段,比如包含\、+等字符的字段。这些特殊字符在查询需要进行转义处理,否则会导致查询失败。可以使用查询的"query_string"查询方法,并在查询字符串中对特殊字符进行转义,比如将\转义为\\。 除了以上情况,还可能会遇到其他特殊字符的查询问题,比如查询包含空格、引号等字符的数据。在这种情况下,可以尝试使用Elasticsearch提供的内置处理方法,比如使用"match_phrase"查询方法进行精确匹配。 总之,当遇到一些转义字符查询无法正常查询的情况,我们需要对查询字符串进行适当的处理和转义,以确保能够正确匹配到含有特殊字符的数据。这样才能保证在Spring Boot集成Elasticsearch,能够将包含转义字符的数据正确地查询出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值