Spring boot 集成 elasticSearch
(1)、引入依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.2</version>
</dependency>
(2)、去除springboot父依赖中默认集成的es
更改后的
(3)、创建配置文件,给容器中注入一个RestHighlevelClient
@Configuration
public class ElasticSearchConfig {
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 esClient() {
return new RestHighLevelClient(RestClient.builder(new HttpHost("192.168.56.10", 9200, "http")));
}
}
(4)、ElasticSearch Demo测试
需要参考的几个网页
- 官网客户端:https://www.elastic.co/guide/en/elasticsearch/client/index.html
- maven依赖地址:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-getting-started-maven.html
- es配置:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-getting-started-initialization.html
- 基本操作api:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-document-index.html
- 搜索api:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-search.html
package com.song.gulimall.gulimallsearch;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.song.gulimall.gulimallsearch.config.ElasticSearchConfig;
import lombok.Data;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.io.IOException;
@SpringBootTest
@RunWith(SpringRunner.class)
class GulimallSearchApplicationTests {
@Resource
private RestHighLevelClient client;
@Test
void contextLoads1() throws IOException {
SearchRequest searchRequest = new SearchRequest("user");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchRequest.source(searchSourceBuilder);
SearchResponse response = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);
System.out.println(response);
SearchHit[] hits = response.getHits().getHits();
for (SearchHit hit : hits) {
String asString = hit.getSourceAsString();
System.out.println(asString);
System.out.println(JSON.parseObject(asString,User.class));
}
System.out.println();
}
@Test
void contextLoads() throws IOException {
IndexRequest request = new IndexRequest("user");
request.id("1");
User user = new User();
user.setName("zhangsan");
user.setGender("男");
user.setAge(18);
String jsonString = JSON.toJSONString(user);
request.source(jsonString, XContentType.JSON);
IndexResponse response = client.index(request, ElasticSearchConfig.COMMON_OPTIONS);
System.out.println(response);
}
@Data
static class User {
private String name;
private String gender;
private Integer age;
}
}
搜索Demo
@Test
void searchData() throws IOException {
//1.创建一个检索请求
SearchRequest searchRequest = new SearchRequest();
//制定索引
searchRequest.indices("bank");
//制定DSL,检索条件
// SearchSourceBuilder searchSourceBuilder 封装检索条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//1.1)构造检索条件
// searchSourceBuilder.query();
// searchSourceBuilder.from();
// searchSourceBuilder.size();
// searchSourceBuilder.aggregation();
searchSourceBuilder.query(QueryBuilders.matchQuery("address", "mill"));
//1.2)按照年龄的值分布进行聚合
TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
searchSourceBuilder.aggregation(ageAgg);
//1.3)计算平均薪资
AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
searchSourceBuilder.aggregation(balanceAvg);
System.out.println("检索条件" + searchSourceBuilder.toString());
SearchRequest source = searchRequest.source(searchSourceBuilder);
//2.执行检索
SearchResponse searchResponse = client.search(source, GulimallElasticSearchConfig.COMMON_OPTIONS);
//3、分析结果
System.out.println(searchResponse.toString());
// Map map = JSON.parseObject(searchResponse.toString(), Map.class);
//3.1)、获取所有查到的数据
SearchHits hits = searchResponse.getHits();
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
//在此之前根据json生成java对象Account
String sourceAsString = hit.getSourceAsString();
Account account = JSON.parseObject(sourceAsString, Account.class);
System.out.println("account = " + account);
}
//3.2)获取检索到的分析信息
Aggregations aggregations = searchResponse.getAggregations();
// for (Aggregation aggregation : aggregations.asList()) {
// System.out.println("name = " + aggregation.getName());
// }
System.out.println("aggregations = " + aggregations.toString());
Terms ageAgg1 = aggregations.get("ageAgg");
for (Terms.Bucket bucket : ageAgg1.getBuckets()) {
String keyAsString = bucket.getKeyAsString();
System.out.println("年龄 = " + keyAsString + "===>" + bucket.getDocCount());
}
Avg balanceAvg1 = aggregations.get("balanceAvg");
System.out.println("平均薪资" + balanceAvg1.getValue());
System.out.println(aggregations);
}