ElasticSearch
1、ElasticSearch学习随笔之基础介绍
2、ElasticSearch学习随笔之简单操作
3、ElasticSearch学习随笔之java api 操作
4、ElasticSearch学习随笔之SpringBoot Starter 操作
5、ElasticSearch学习随笔之嵌套操作
6、ElasticSearch学习随笔之分词算法
7、ElasticSearch学习随笔之高级检索
8、ELK技术栈介绍
9、Logstash部署与使用
10、ElasticSearch 7.x 版本使用 BulkProcessor 实现批量添加数据
11、ElasticSearch 8.x 弃用了 High Level REST Client,移除了 Java Transport Client,推荐使用 Elasticsearch Java API
12、ElasticSearch 8.x 使用 snapshot(快照)进行数据迁移
13、ElasticSearch 8.x 版本如何使用 SearchRequestBuilder 检索
14、ElasticSearch 8.x 使用 High Level Client 以 HTTPS 方式链接,SSL 证书、主机名验证器 各是什么,如何忽略
15、ElasticSearch 8.x 创建父子文档,用Join类型字段以及用has_child、has_parent 检索
ElasticSearch学习随笔之SpringBoot Starter 操作ElasticSearch,创始人 Shay Banon(谢巴农)
本文主讲 SpringBoot Starter 操作ES。
文章目录
前言
本文主要针对 SpringBoot Starter 如何操作 ES 记录简单案例。
一、加入Springboot Starter依赖
话不多说,直接copy,后面要用 Junit Test 测试,加入测试包
<!--整合 ES-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
二、application.yml 配置 & 创建单元测试类
2.1 application.yml 配置
server:
port: 8001
spring:
application:
name: xxxx-server #随便写个名字
elasticsearch: #以下配置 主要用于 ElasticsearchRepository (两种操作方式,方式一配置)
rest:
uris: http://localhost:9200 #连接地址
data: #以下配置主要用于 ElasticsearchRestTemplate (两种操作方式,方式二配置)
elasticsearch:
repositories:
enabled: true
client:
reactive:
endpoints: localhost:9200
2.2 单元测试类
package com.wesh.es;
import com.wesh.home.HomeApplication;
import com.wesh.home.dao.es.TenderTestRepository;
import com.wesh.home.model.Tender;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.Query;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = HomeApplication.class)
public class ESTest {
}
三、单元测试前奏
3.1 创建一个实体Bean(Tender.java)
package com.wesh.home.model;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
@Document(indexName = "tender_test3")
public class Tender {
@Id
private String id;
@Field(name = "product_agency", type = FieldType.Keyword)
private String productAgency;
@Field(name = "notice_type_id", type = FieldType.Keyword)
private String noticeTypeId;
@Field(name = "product_name", type = FieldType.Keyword)
private String productName;
@Field(name = "notice_type", type = FieldType.Keyword)
private String noticeType;
/*get set 方法省略*/
3.2 添加xxxxRepository 查询接口
我们只需要定义接口即可进行相关的 ES 简单操作,不过要集成 Spring Data 提供的接口 ElasticsearchRepository。
Spring Data 提供的 接口中,按照 我们定义的方法名称 进行 ES 查询操作。具体规则可查阅 Spring官网总结方法命名规则
package com.wesh.home.dao.es;
import com.wesh.home.model.Tender;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface TenderTestRepository extends ElasticsearchRepository<Tender, String> {
/**
* 根据 productName 查询,根据 方法 名称查询
* @param productName
* @param pageRequest
* @return
*/
Page<Tender> findByProductName(String productName, PageRequest pageRequest);
}
为什么我们集成了ES提供的 repositoty 接口就可以操作es, 因为 spirng 定义了CRUD 接口。
四 单元测试方法
4.1 新增
@RunWith(SpringRunner.class)
@SpringBootTest(classes = HomeApplication.class)
public class ESTest {
@Resource
private TenderTestRepository tenderTestRepository;
@Test
public void save(){
Tender tender = new Tender();
tender.setNoticeType("招标广告");
tender.setNoticeTypeId("12");
tender.setProductName("血培养仪");
tender.setProductAgency("山东方中工程管理有限公司");
tenderTestRepository.save(tender);
}
}
4.2 id获取
@RunWith(SpringRunner.class)
@SpringBootTest(classes = HomeApplication.class)
public class ESTest {
@Resource
private TenderTestRepository tenderTestRepository;
@Test
public void get(){
Tender tender = tenderTestRepository.findById("kmfaxoABYWTnJb2BeotB").get();
System.out.println(tender);
}
}
4.3 产品名称搜索
@RunWith(SpringRunner.class)
@SpringBootTest(classes = HomeApplication.class)
public class ESTest {
@Resource
private TenderTestRepository tenderTestRepository;
/**
* 这里调用的就是 根据 productName 字段查询,spring data 提供的接口会根据名称组装查询
*/
@Test
public void findByProductName(){
Page<Tender> tenders = tenderTestRepository.findByProductName("血培养仪", PageRequest.of(0,10));
tenders.forEach(tender -> System.out.println(tender));
}
}
4.4 修改
@RunWith(SpringRunner.class)
@SpringBootTest(classes = HomeApplication.class)
public class ESTest {
@Resource
private TenderTestRepository tenderTestRepository;
@Test
public void update(){
Tender tender = tenderTestRepository.findById("kmfaxoABYWTnJb2BeotB").get();
tender.setProductAgency("微生物鉴定药敏鉴定器");
tender.setProductName("鉴定药敏鉴定器");
tenderTestRepository.save(tender);
}
}
4.5 删除
@RunWith(SpringRunner.class)
@SpringBootTest(classes = HomeApplication.class)
public class ESTest {
@Resource
private TenderTestRepository tenderTestRepository;
@Test
public void delete(){
Tender tender = tenderTestRepository.findById("kmfaxoABYWTnJb2BeotB").get();
tenderTestRepository.delete(tender);
}
}
4.6 ElasticsearchRestTemplate 查询
@RunWith(SpringRunner.class)
@SpringBootTest(classes = HomeApplication.class)
public class ESTest {
@Autowired
private ElasticsearchRestTemplate esRestTemplate;
/**
* 用 restTemplate操作
*/
@Test
public void findByQuery(){
QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("山东方中工程管理有限公司", "product_agency");
Query query = new NativeSearchQueryBuilder().withQuery(queryBuilder).build();
SearchHits<Tender> tenderSearchHits = esRestTemplate.search(query, Tender.class, IndexCoordinates.of("tender_test3"));
tenderSearchHits.get().forEach(tenderSearchHit -> {
Tender content = tenderSearchHit.getContent();
System.out.println(content);
});
}
}
总结
以上是Spring Data 提供的接口对 ES 的增删改查的简单案例,方便公司里面临时有需要对ES操作大量数据是,可以直接copy 执行。
后期有时间持续更新。