springboot整合es

基于尚硅谷的电商项目笔记

es提供了很多种客户端用于操作,这里我们使用官方推荐的Java High Level REST Client

导入依赖

1
2
3
4
5
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.2</version>
</dependency>

因为不同的springboot版本默认的es版本会不一致,所以需要特别指定es版本

编写配置

创建config.GulimallElasticsearchConfig文件,写入配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23


@Configuration
public class GulimallElasticsearchConfig {
public static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
//builder.addHeader("Authorization", "Bearer " + TOKEN);
//builder.setHttpAsyncResponseConsumerFactory(
// new HttpAsyncResponseConsumerFactory
// .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
COMMON_OPTIONS = builder.build();
}

@Bean
public RestHighLevelClient esRestClient() {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("192.168.111.100", 9200, "http")));
return client;
}

}

一些常用的API测试

新增索引API

新增索引可以以对象的方式或者json的方式新增。

1
2
3
4
5
6
 @Data
class User{
private String userName;
private String gender;
private String age;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* 测试存储数据到es
* 更新也可以
*/
@Test
public void indexData() throws IOException {
IndexRequest indexRequest = new IndexRequest("users");
// 数据的id
indexRequest.id("1");
//方式一
//indexRequest.source("username","zhangsan","age",18,"gender","男");
//方式二
User user = new User();
user.setUserName("zhangsan");
user.setAge("18");
user.setGender("男");
String jsonString = JSON.toJSONString(user);
indexRequest.source(jsonString, XContentType.JSON);

// 执行操作
IndexResponse index = client.index(indexRequest, GulimallElasticsearchConfig.COMMON_OPTIONS);

// 提前有用的响应数据
System.out.println(index);
}

GET users/_search

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
"took" : 367,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "users",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"age" : "18",
"gender" : "男",
"userName" : "zhangsan"
}
}
]
}
}

删、改请参考官网的示范例子

复杂检索API

检索条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"query": {
"match": {
"address": {
"query": "mill"
}
}
},
"aggregations": {
"ageAgg": {
"terms": {
"field": "age",
"size": 10
}
},
"balanceAvg": {
"avg": {
"field": "balance"
}
}
}
}

相关测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
@Data
@ToString
static class Account {

private int account_number;
private int balance;
private String firstname;
private String lastname;
private int age;
private String gender;
private String address;
private String employer;
private String email;
private String city;
private String state;


}


@Test
public void searchData() throws IOException {
// 1.创建检索请求
SearchRequest searchRequest = new SearchRequest();
// 指定索引
searchRequest.indices("bank");
// 指定DSL,检索条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 1.1构造检索条件
searchSourceBuilder.query(QueryBuilders.matchQuery("address","mill"));

// 1.2 按照年龄的值分布进行聚合
TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
searchSourceBuilder.aggregation(ageAgg);

// 1.3 计算平均薪资
AvgAggregationBuilder balanceAgg = AggregationBuilders.avg("balanceAvg").field("balance");
searchSourceBuilder.aggregation(balanceAgg);

System.out.println("检索条件:"+searchSourceBuilder.toString());

searchRequest.source(searchSourceBuilder);

// 2.执行检索
SearchResponse searchResponse = client.search(searchRequest, GulimallElasticsearchConfig.COMMON_OPTIONS);

// 3.分析结果
System.out.println(searchResponse.toString());
// 3.1 获取所有查到的数据
SearchHits hits = searchResponse.getHits();
SearchHit[] searchHits = hits.getHits();
for (SearchHit searchHit : searchHits) {
//searchHit.getIndex()
String sourceAsString = searchHit.getSourceAsString();
Account account = JSON.parseObject(sourceAsString, Account.class);
System.out.println("account:"+account);
}

// 3.2 获取这次检索到的分析信息
Aggregations aggregations = searchResponse.getAggregations();
//List<Aggregation> aggregationList = aggregations.asList();
//for (Aggregation aggregation : aggregationList) {
// System.out.println("当前聚合"+aggregation.getName());
//}
Terms ageAgg1 = aggregations.get("ageAgg");
for (Terms.Bucket bucket : ageAgg1.getBuckets()) {
String keyAsString = bucket.getKeyAsString();
System.out.println("年龄:"+keyAsString);
}

Avg balanceAvg = aggregations.get("balanceAvg");
System.out.println("平均薪资:"+balanceAvg.getValue());
}

结果

  • 更多文档请参考官方文档

https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.5/java-rest-high-search.html