Elasticsearch查询10000条限制解决方案

目录

问题描述

问题原因

解决方案


问题描述

Elasticsearch官方默认最多只能查询10000条数据,查询20000条数据开始就会报错:

Resultwindowis too large, from+ size must be less than or equal to: [10000] but was [20000]. See the scroll api for a more efficient way to request large data sets. This limit can be setby changing the [index.max_result_window] index level setting.

问题原因

max_result_window 是 Elasticsearch 中一个重要的搜索参数,它控制了单个搜索请求返回的最大结果数。具体来说,它定义了从搜索结果中的哪个位置开始返回结果,以及要返回多少个结果。

默认情况下,Elasticsearch 的 max_result_window 参数设置为 10000。这意味着,如果您执行一个搜索请求,请求的结果超过了 10000 条记录,那么只会返回前 10000 条记录,并且 Elasticsearch 会在响应中包含一个 hits.total 字段,该字段表示总共匹配了多少条记录。

如果您需要检索更多的结果,可以通过增加 from 和 size 参数来获取更多的结果,但是 from + size 不能超过 max_result_window 的值。如果您的搜索结果超过了 max_result_window 的值,那么 Elasticsearch 将会返回一个错误,提示您使用 scroll API 或者增加 max_result_window 的值来处理这个问题。

解决方案

方案一(max_result_window

1.修改索引的 index.max_result_window

PUT /<index 或者 _all>/_settings
{
  "index.max_result_window": 100000
}

或者在配置文件elasticsearch.yml中增加下列配置,并重启elasticsearch。

index.max_result_window: 100000

或者在创建索引时添加最大上限设置

{
  "settings": {
    "index": {
      "max_result_window": 20000
    }
  }
}

需要注意的是,将 max_result_window 参数设置得太大可能会影响 Elasticsearch 的性能。因此,建议在使用 max_result_window 参数时,根据实际情况和性能要求来选择合适的值

2.代码中解除限制

在查询时候把 track_total_hits 设置为 true。

track_total_hits 设置为false禁用跟踪匹配查询的总点击次数

设置为true就会返回真实的命中条数。

NativeSearchQuery query = nativeSearchQueryBuilder.withTrackTotalHits(true).build();
	
//public NativeSearchQueryBuilder withTrackTotalHits(Boolean trackTotalHits) {
//	this.trackTotalHits = trackTotalHits;
//	return this;
//}

 3.在使用工具访问时添加track_total_hits设置

GET /<index 或者 _all>/_search
{
  "query": {
    "match_all": {}
  },
  "track_total_hits": true
}

方案二(scroll)

scroll 的方式,官方的建议不用于实时的请求,一般用于数据导出,每一个 scroll_id 不仅会占用大量的资源,而且会生成历史快照,对于数据的变更不会反映到快照上。

方案三(search_after)

search_after 分页的方式是根据上一页的最后一条数据来确定下一页的位置,同时在分页请求的过程中,如果有索引数据的增删改查,这些变更也会实时的反映到游标上。但是需要注意,因为每一页的数据依赖于上一页最后一条数据,所以无法跳页请求。

为了找到每一页最后一条数据,每个文档必须有一个全局唯一值,官方推荐使用 _uid 作为全局唯一值,其实使用业务层的 id 也可以。
 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值