Spring Data集成Elasticsearch为何发送两次请求?
原因分析
这种两次请求的现象是Spring Data Elasticsearch的默认行为,具体逻辑如下:
当你定义的查询方法返回类型为
Page<T>(分页结果),或者需要获取查询结果的总命中数时,Spring Data Elasticsearch会自动拆分为两次请求:- 第一次请求:发送
"size": 0且"track_total_hits": 2147483647的查询,核心目的是精确统计符合条件的总文档数量。size:0表示不返回具体文档内容,只做计数;track_total_hits设为ES支持的最大值,是为了绕过ES默认的命中数统计限制(ES默认仅精确统计前10000条,超过后返回近似值),确保拿到准确的总条数。 - 第二次请求:携带
"size": 103的查询,目的是获取实际的文档数据。这里的103是当前查询需要返回的文档总量(比如分页场景下的目标数据量,或是方法指定的返回条数),此时无需再统计总数,因此不会携带track_total_hits参数。
- 第一次请求:发送
若你不需要分页结果,仅需获取匹配的文档数据,可将查询方法的返回类型改为
List<T>而非Page<T>,此时Spring Data Elasticsearch只会发送一次请求,直接获取数据而不单独统计总数。
内容的提问来源于stack exchange,提问作者Colin
相关产品推荐
相关产品推荐

