项目场景:
环境 :
Centos7 + ES 7.9.0 集群
问题描述
Elasticsearch官方默认限制索引查询最多只能查询10000条数据,查询第10001条数据开始就会报错:
Result window is too large, from + size must be less than or equal to
但是很多时候10000数据不能满足项目的需求,所以我们就要解除这个限制。
原因分析:
elasticsearch中
max_result_window
有上限限制:默认10000。
解决方案:
1、第一种解决方案
在restful
请求时,解除索引最大查询数的限制
PUT _all/_settings
{
"index.max_result_window": 200000
}
_all
表示所有索引,如果针对单个索引的话修改成索引名称即可!
2、第二种解决方案
在创建索引的时候加上
{
"settings": {
"index": {
"max_result_window": 10000000000
}
}
}
但是修改完之后,通过api查询回来的totalhits还是只有10000条?
解决如下 :
在查询时候把 track_total_hits
设置为true
。
track_total_hits
设置为false
禁用跟踪匹配查询的总点击次数
设置为true就会返回真实的命中条数。
java代码在构建条件时候加上:
searchSourceBuilder.trackTotalHits(true);
rest请求查询时:
GET 索引名/_search
{
"query": {
"match_all": {}
},
"track_total_hits": true
}
备注
- 以上方案都无需重启集群。
es默认最大返回数是10000,支持的最大返回数是2^31-1,也就是2147483647,不建议设置太大,query数据时size不要太大,总得考虑内存消耗的,设置了返回max后可以用分页获取, from:num_a, size:num_b,获取的就是num_a+1到num_a+num_b的数据。