ES查询一次超过10000条,与深度分页

ES版本 7.12

默认情况下,不指定 fromsize,仅返回10条;
默认情况下,指定 fromsize,from + size 不可超过10000;

一次查询超过10000条处理方式

当实际返回需要超过10000条的时候,有下面几种处理方式

  1. 增大 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"}'
  1. 设置 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);
// 省略查询方法...

  1. cardinality 去除,相当于mssql distinct,减少重复数据出现
    cartinality metric,对每个bucket中的指定的field进行去重,取去重后的count,类似于count(distcint)
    cardinality,count(distinct),5%的错误率,性能在100ms左右

思考
一般的业务场景,其实不需要一次性返回10000个文档,所以首先应该从产品设计角度考虑,是否可以避免一次10000个文档返回的情况出现。
所以一般情况并不建议增加直接增大返回条数。

深度分页

ES分页限制分页查询条数(from + size)不可大于 10000,主要是考虑资源消耗太大,分页越深越容易出现 OOM 错误。
首先 fromsize 是无法做深度分页。

  1. scroll 进行深度分页
    // 待完善
  2. search_after进行深度分页
    // 待完善

其他

其实 mysql 也存在深度分页的性能问题,但是 mysql 并没有限制分页深度。那么 mysql 常见的深度分页优化方法有哪些呢?
// 待完善
参考:https://juejin.cn/post/6985478936683610149

你可能感兴趣的:(ES查询一次超过10000条,与深度分页)