美文网首页
ES查询一次超过10000条,与深度分页

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

作者: zhimin_ | 来源:发表于2022-12-06 11:38 被阅读0次

    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条,与深度分页

          本文链接:https://www.haomeiwen.com/subject/flabfdtx.html