1. 引入
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>{version}</version>
</dependency>
@Bean
public RestHighLevelClient ESRestClient() {
return new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1", 9200, "http")));
}
可能遇到的报错1:
Found interface org.elasticsearch.common.bytes.BytesReference, but class was expected
-- highlevelclient版本和es版本不一致导致,因为springboot默认会管理es的版本,很有可能和你引入的client版本不一致
在<properties>中覆盖版本即可
<elasticsearch.version>7.4.2</elasticsearch.version>
2. 带条件的查询
以示例数据中的订单数据为例
GET _cat/indices
GET kibana_sample_data_ecommerce/_search
{
"query": {
"match": {
"customer_gender": "MALE"
}
},
"aggs": {
"customerAgg": {
"terms": {
"field": "customer_id",
"size": 10
}
},
"priceAgg": {
"avg": {
"field": "taxful_total_price"
}
}
}
}
DSL查询结果:
对应代码:
void searchDate() throws IOException {
// 1. 创建检索请求
SearchRequest request = new SearchRequest();
request.indices("kibana_sample_data_ecommerce");
SearchSourceBuilder builder = new SearchSourceBuilder();
request.source(builder);
// 设置检索条件
builder.query(QueryBuilders.matchQuery("customer_gender", "MALE"));
// builder.from(0);
// builder.size(20);
// 按照customer_id聚合
builder.aggregation(AggregationBuilders.terms("customerAgg").field("customer_id").size(10));
//
builder.aggregation(AggregationBuilders.avg("priceAgg").field("taxful_total_price"));
// 2. 执行检索
SearchResponse response = client.search(request, COMMON_OPTIONS);
// 3. 处理响应
System.out.println(request.source());
SearchHit[] hits = response.getHits().getHits();
for (SearchHit hit: hits) {
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
}
// 获取聚合结果
Terms customerAgg = response.getAggregations().get("customerAgg");
customerAgg.getBuckets().forEach(bucket -> System.out.println(bucket.getKey()));
}