Elasticsearch 7.7.0 学习springboot集成es使用,实现增删改查
导入依赖
<!-- 导入es的rest-high-level-client和elasticsearch server-->
<!-- elasticsearch 高阶版本依赖 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.7.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.7.0</version>
</dependency>
复制代码
spring框架有自己的自动配置类,只要我们导入对应的依赖,比如es的依赖,那么spring框架就根据这个自己的自动配置类,将es的所有的东西都导入,之后我们就直接拿es的东西用就可以了。
配置config
@Configuration
public class ElasticSearchConfig {
/**
* 创建单例模式的RequestOptions,使得所有请求共用
*/
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 client() {
RestClientBuilder builder=RestClient.builder(new HttpHost("localhost", 9200, "http"));
RestHighLevelClient client = new RestHighLevelClient(builder);
return client;
}
}
复制代码
将配置类导入测试类里面进行使用
// 将配置类引入,利用这个配置类里面的方法对软件进行增删改查
@Autowired
@Qualifier("restHighLevelClient")
private RestHighLevelClient client;
复制代码
代码操作
1、创建索引(相当于创建数据库了)
/**
* 创建索引
* @throws IOException
*/
@Test
void testCreateIndex() throws IOException{
// 1、创建索引请求
CreateIndexRequest request = new CreateIndexRequest("users");
// 2、客户端client执行请求 IndicesClient对象,请求后获得响应
CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
System.out.println(createIndexResponse);
}
复制代码
创建成功后我们可以看到
2、删除索引
/**
* 删除索引
* @throws IOException
*/
@Test
void textDeleteIndex() throws IOException{
DeleteIndexRequest request = new DeleteIndexRequest("users");
AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT);
System.out.println(delete);
}
复制代码
3、添加文档
/**
* 保存用户数据,向索引内添加文档
*/
@Test
public void indexData() throws IOException {
//指定索引和id
IndexRequest request=new IndexRequest("users");
request.id("1");
request.timeout("1s");
//创建对象
User user=new User("张三","男",22);
String userString=objectMapper.writeValueAsString(user);
request.source(userString, XContentType.JSON);
//执行保存操作
IndexResponse indexResponse=client.index(request, ElasticSearchConfig.COMMON_OPTIONS);
System.out.println(indexResponse.toString());
System.out.println(indexResponse.status());
}
复制代码
添加文档之后我们可以看到
4、获取文档信息
/**
* 获取文档信息
* @throws IOException
*/
@Test
void testGetDocument() throws IOException {
GetRequest getRequest = new GetRequest("users", "1");
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
System.out.println(getResponse.getSourceAsString());
System.out.println(getResponse);
}
复制代码
5、更新文档
/**
* 更新用户数据
*/
@Test
public void updateData() throws IOException {
UpdateRequest updateRequest = new UpdateRequest("users", "1");
updateRequest.timeout("1s");
User user = new User("张飞", "男", 25);
String jsonString = JSONValue.toJSONString(user);
updateRequest.doc(jsonString,XContentType.JSON);
UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(updateResponse.status());
}
复制代码
6、删除文档
/**
* 删除文档记录
*/
@Test
public void deleteData() throws IOException {
//指定索引和id
DeleteRequest request=new DeleteRequest("users","1");
request.timeout("1s");
//执行保存操作
DeleteResponse indexResponse=client.delete(request,ElasticSearchConfig.COMMON_OPTIONS);
System.out.println(indexResponse.status());
}
复制代码
7、批量插入数据,批量更新和批量删除
/**
* 批量插入
* @throws IOException
*/
@Test
void testBulkRequest() throws IOException{
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
ArrayList<Object> arrayList = new ArrayList<>();
arrayList.add(new User("张三","男",23));
arrayList.add(new User("李四","男",23));
arrayList.add(new User("王五","男",23));
arrayList.add(new User("马六","男",23));
for (int i=0;i< arrayList.size();i++){
bulkRequest.add(
// 批量更新和批量删除,就在这里修改对应的请求就可以了
new IndexRequest("users").id(""+(i+3))
.source(JSONValue.toJSONString(arrayList.get(i)),
XContentType.JSON));
}
final BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures());
//是否失败, 返回false 代表成功
}
复制代码
8、查询
/**
* 复杂检索数据
*/
@Test
public void searchData() throws IOException {
//1.创建检索请求
SearchRequest searchRequest = new SearchRequest();
//指定索引
searchRequest.indices("users");
//指定DSL,检索条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//1.1 构造检索条件
//address中包含mill
searchSourceBuilder.query(QueryBuilders.matchQuery("name", "张三"));
//按照前10种年龄分布进行聚合
TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
searchSourceBuilder.aggregation(ageAgg);
//求所有人年龄的平均值
AvgAggregationBuilder ageAvg = AggregationBuilders.avg("ageAvg").field("age");
searchSourceBuilder.aggregation(ageAvg);
System.out.println(searchSourceBuilder);
searchRequest.source(searchSourceBuilder);
//2.执行检索
SearchResponse searchResponse = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);
//3.分析结果
//3.1 查看查询结果
SearchHits hits = searchResponse.getHits();
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
System.out.println(hit);
}
//3.2 查看聚合结果
Aggregations aggs = searchResponse.getAggregations();
Terms ageAgg2 = aggs.get("ageAgg");
for (Terms.Bucket bucket : ageAgg2.getBuckets()) {
System.out.println("年龄:" + bucket.getKeyAsString()+"==> 人数:"+bucket.getDocCount());
}
System.out.println();
Avg ageAvg2 = aggs.get("ageAvg");
System.out.println("平均年龄:" + ageAvg2.getValue());
}
复制代码
可以看到