ES版本 7.12
默认情况下,不指定 from
和 size
,仅返回10条;
默认情况下,指定 from
和 size
,from + size 不可超过10000;
一次查询超过10000条处理方式
当实际返回需要超过10000条的时候,有下面几种处理方式
- 增大
max_result_window
,其实是唯一方法
PUT your_index
{
"settings": {
"max_result_window": "100000"
}
}
PUT your_index/_settings?preserve_existing=true
{
"max_result_window": "100000"
}
curl -H "Content-Type: application/json" -X PUT 'http://127.0.0.1:9200/your_index/_settings?preserve_existing=true' -d '{"max_result_window" : "100000"}'
- 设置
track_total_hits
,只能让total count结果返回呈现大于10000的值,如果要查询超出10000的文档,需要进一步通过深度分页完成
GET you_index/_search
{
"from":0,
"size":10000,
"track_total_hits":true,
"query":{
}
}
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.trackTotalHits(true);
// 省略查询方法...
-
cardinality
去除,相当于mssql distinct,减少重复数据出现
cartinality metric,对每个bucket中的指定的field进行去重,取去重后的count,类似于count(distcint)
cardinality,count(distinct),5%的错误率,性能在100ms左右
思考:
一般的业务场景,其实不需要一次性返回10000个文档,所以首先应该从产品设计角度考虑,是否可以避免一次10000个文档返回的情况出现。
所以一般情况并不建议增加直接增大返回条数。
深度分页
ES分页限制分页查询条数(from + size)不可大于 10000,主要是考虑资源消耗太大,分页越深越容易出现 OOM 错误。
首先 from
,size
是无法做深度分页。
-
scroll
进行深度分页
// 待完善 -
search_after
进行深度分页
// 待完善
其他
其实 mysql 也存在深度分页的性能问题,但是 mysql 并没有限制分页深度。那么 mysql 常见的深度分页优化方法有哪些呢?
// 待完善
参考:https://juejin.cn/post/6985478936683610149
网友评论