有时候我们在ES的查询的数据量比较大(字段较多&数据量比较大)。怎样去优化一个查询速度。
- 在使用query的可以使用filter来代替must。filter不会计算分数会优先走缓存。
- 开启es的数据压缩,可以将数据压缩比原始大小更小减少网络延迟。
主要记录一下Java es client开启数据gzip压缩。
只有客户端请求压缩时Elasticsearch才压缩数据。Java 客户端通过http request发送额外请求选项要求压缩。
实例代码:
//开启 gzip 压缩
RequestOptions requestOptions = RequestOptions.DEFAULT.toBuilder()
.addHeader("Accept-Encoding", "gzip, deflate")
.addHeader("Content-type", "application/json")
.build();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//公司id列表筛选
boolQueryBuilder.filter(QueryBuilders.termsQuery("companyId", companyIdList));
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.timeout(new TimeValue(60L, TimeUnit.SECONDS));
sourceBuilder.from(0);
sourceBuilder.size(10000);
sourceBuilder.query(boolQueryBuilder);
//查询请求
SearchRequest searchRequest = new SearchRequest(new String[]{"test_index"}, sourceBuilder);
SearchResponse resp = restHighLevelClient.search(searchRequest, requestOptions);
<elasticsearch>7.8.0</elasticsearch>
注意:Elasticsearch 7.8以上版本中
rest高级客户端会自动解压数据。
Elasticsearch 7.7 及以下版本处理压缩响应
高级不支持处理压缩数据,当接收到压缩响应会直接抛出运行时异常。低级客户端提供Elasticsearch原始响应,因此可以进行解压。需要额外操作可以查阅官网。
在我们服务端请求es的时候数据已经压缩了,但是我们服务端到前端是请求还是没有压缩,大数据也是非常占用网络带宽。
以Spring boot 开启我们的压缩配置为例:
server:
compression:
enabled: true
mime-types: application/javascript,text/css,application/json,application/xml,text/html,text/xml,text/plain
min-response-size: 2KB