ES查询报错内容长度超过104857600

项目场景:

使用 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,将缓冲区大小设置为您需要的大小。这样就可以增加缓冲区大小,使其能够处理更大的请求内容

查看源码
在这里插入图片描述
在这里插入图片描述
ES查询报错内容长度超过104857600_第1张图片
进入 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);
		..........
	}
}

你可能感兴趣的:(elasticsearch,大数据,搜索引擎)