项目场景:
使用 ElasticsearchRestTemplate 或者使用 RestHighLevelClient 查询 ES 报错 内容长度超过 104857600
问题描述
ES 查询报错 entiity content is too long xxx for the configured buffer limit 104857600
@Override
public void esQuery() {
restHighLevelClient.search(request, RequestOptions.DEFAULT);
// elasticsearchRestTemplate.search()
..........
}
原因分析:
这个错误提示表明您的请求内容超过了配置的缓冲区限制。默认情况下,Spring Data Elasticsearch的ElasticsearchRestTemplate底层调用的还是RestHighLevelClient,它的缓冲区大小限制是104857600字节(100MB)。
您可以通过以下两种方式解决这个问题:
分割请求:将您的搜索请求分割成多个较小的请求,并分别执行。这样可以确保每个请求的内容不会超过缓冲区限制。
自定义缓冲区大小:创建一个自定义的ClientHttpRequestFactory,将缓冲区大小设置为您需要的大小。这样就可以增加缓冲区大小,使其能够处理更大的请求内容
查看源码
进入 RequestOptions 类中发现就是此处限制大小104857600
解决方案:
这里给出第二种解决方案:
如果你使用的是Spring Data Elasticsearch 那么换成 restHighLevelClient
@Service
@RequiredArgsConstructor
public class EsServiceImpl{
//注入RestHighLevelClient
private RestHighLevelClient restHighLevelClient;
static {
// 自定义返回参数大小 单位 BYTE
RequestOptions.Builder requestOptions = RequestOptions.DEFAULT.toBuilder();
requestOptions.setHttpAsyncResponseConsumerFactory(new HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory(500 * 1024 * 1024));
DEFAULT = requestOptions.build();
}
@Override
public void esQuery() {
restHighLevelClient.search(request, DEFAULT);
..........
}
}