四、Spring Data Elasticsearch集成
- Spring Data Elasticsearch 基于 spring data API 简化 Elasticsearch 操作,将原始操作Elasticsearch 的客户端 API 进行封装 。Spring Data 为 Elasticsearch 项目提供集成搜索引擎。Spring Data Elasticsearch POJO 的关键功能区域为中心的模型与 Elastichsearch 交互文档和轻松地编写一个存储索引库数据访问层。
- 官方网站: https://spring.io/projects/spring-data-elasticsearch
1、创建Springboot项目
- 略
2、导入相应依赖
-
<properties> <java.version>1.8</java.version> <elasticsearch.version>7.8.0</elasticsearch.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
3、编写 application.properties 配置文件
-
elasticsearch.host=127.0.0.1 elasticsearch.port=9200
4、编写实体类
-
@Data @NoArgsConstructor @AllArgsConstructor @ToString public class Student { //商品唯一标识id private Long id; //商品名称 private String name; //分类名称 private String sex; //商品价格 private Integer age; }
5、编写配置类
-
ElasticsearchRestTemplate 是 spring-data-elasticsearch 项目中的一个类,和其他 spring 项目中的 template类似。
-
ElasticsearchRestTemplate 基 于 RestHighLevelClient 客户端的。需要自定义配置类,继承 AbstractElasticsearchConfiguration,并实现 elasticsearchClient()抽象方法,创建 RestHighLevelClient 对象。
-
@ConfigurationProperties(prefix = "elasticsearch") @Configuration @Data public class ElasticsearchConfig extends AbstractElasticsearchConfiguration { private String host; private Integer port; @Override public RestHighLevelClient elasticsearchClient() { RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost(host, port) ) ); return client; } }
6、编写DAO数据访问对象
-
@Repository public interface ProductDao extends ElasticsearchRepository<Student,Long> { }
7、实体类映射Es操作
-
@Data @NoArgsConstructor @AllArgsConstructor @ToString @Document(indexName = "student", shards = 3, replicas = 1) public class Student { //必须有 id,这里的 id 是全局唯一的标识,等同于 es 中的"_id" @Id private Integer id;//商品唯一标识 /** * type : 字段数据类型 * analyzer : 分词器类型 * index : 是否索引(默认:true) * Keyword : 短语,不进行分词 */ @Field(type = FieldType.Text, analyzer = "ik_max_word") private String name;//商品名称 @Field(type = FieldType.Keyword) private String sex;//分类名称 @Field(type = FieldType.Integer) private Double age;//商品价格 }
8、索引操作
-
@SpringBootTest @RunWith(SpringRunner.class) class EsSpringdataApplicationTests { @Autowired private RestHighLevelClient client; /** * 启动会默认创建索引,跟实体类映射配置有关 */ @Test public void createIndices(){ System.out.println("创建索引"); } /** * 删除索引 * @throws IOException */ @Test public void deleteIndices() throws IOException { //删除索引-请求对象 DeleteIndexRequest request = new DeleteIndexRequest("user"); //发送请求,获得响应 AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT); //操作结果 System.out.println("操作结果 = " + response.isAcknowledged()); } }
9、文档操作
-
@SpringBootTest @RunWith(SpringRunner.class) class EsSpringdataApplicationTests { @Autowired private RestHighLevelClient client; @Autowired private StudentDao studentDao; /** * 新增文档 */ @Test public void addDocument(){ Student student = new Student(2, "李四", "男", 13); studentDao.save(student); } /** * 更新文档 */ @Test public void updateDocument(){ Student student = new Student(1, "张三", "女", 18); studentDao.save(student); } /** * 查询文档 */ @Test public void getDocumentById(){ Student student = studentDao.findById(1).get(); System.out.println(student); } /** * 查询索引文档 */ @Test public void getAllDocument(){ Iterable<Student> students = studentDao.findAll(); for (Student student : students) { System.out.println(student); } } /** * 删除文档 */ @Test public void deleteDocument(){ Student student = new Student(); student.setId(1); studentDao.delete(student); } /** * 批量增加 */ @Test public void bulkAddDocument(){ List<Student> students = new ArrayList<>(); for(int i = 0; i < 10 ; i++){ Student student = new Student(Integer.valueOf(i), "张三" + i, "男", 20+i); students.add(student); } studentDao.saveAll(students); } /** * 分页和排序 */ @Test public void pageAndSort(){ //设置排序(排序方式,正序还是倒序,排序的age) Sort sort = Sort.by(Sort.Direction.DESC, "age"); //当前页,第一页从 0 开始,1 表示第二页 int currentPage = 0; //每页显示多少条 int pageSize = 5; //设置查询分页 PageRequest pageRequest = PageRequest.of(currentPage, pageSize, sort); //分页查询 Page<Student> studentPage = studentDao.findAll(pageRequest); for (Student student : studentPage.getContent()) { System.out.println(student); } } }