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(); 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
|
@Test public void indexData() throws IOException { IndexRequest indexRequest = new IndexRequest("users"); indexRequest.id("1"); 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 { SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("bank"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10); searchSourceBuilder.aggregation(ageAgg);
AvgAggregationBuilder balanceAgg = AggregationBuilders.avg("balanceAvg").field("balance"); searchSourceBuilder.aggregation(balanceAgg);
System.out.println("检索条件:"+searchSourceBuilder.toString());
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, GulimallElasticsearchConfig.COMMON_OPTIONS);
System.out.println(searchResponse.toString()); SearchHits hits = searchResponse.getHits(); SearchHit[] searchHits = hits.getHits(); for (SearchHit searchHit : searchHits) { String sourceAsString = searchHit.getSourceAsString(); Account account = JSON.parseObject(sourceAsString, Account.class); System.out.println("account:"+account); }
Aggregations aggregations = searchResponse.getAggregations(); 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