Spring Data ElasticSearch整合
什么是Spring Data?
Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。 Spring Data可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。
Spring Data的官网:Redirecting…
什么是Spring Data ElasticSearch?
Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端JAVA API 进行封装 。Spring Data为Elasticsearch项目提供集成搜索引擎。Spring Data Elasticsearch POJO的关键功能区域为中心的模型与Elastichsearch交互文档和轻松地编写一个存储库数据访问层。官方网站:Redirecting…
Spring boot 集成spring data elasticsearch的方式来开发更加的方便和快捷。
步骤:
1.起步依赖
2.配置文件配置连接服务器
3.创建POJO 建立映射关系 @document @field @id
4.创建dao接口继承elasticsearchRepository<Article,Long>
根据需要执行不同的dao的方法。
创建Maven工程(jar),导入坐标我们已经导入了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
创建pojo, 添加注解
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;
/**
* @Author: quanzixiong
* @Date: 2022/01/09 10:39
* @Document:放置到类上
* indexName = "blog1":表示索引的名称,(小写)
* type = "article":表示类型
* @Id:放置到字段id上
* 表示该字段的值存放到索引库的_id字段上,表示主键
* @Field:放置到字段上
* store = true:表示该字段的值存储到索引库
* index = true:表示该字段的值要建立索引用于搜索
* analyzer = "ik_smart":建立索引的时候使用什么分词器
* searchAnalyzer = "ik_smart":数据搜索的时候使用什么分词器(可以不写)
* type = FieldType.Text:存放字段的数据类型
*/
@Document(indexName = "blog04",type = "article")
public class Article {
@Id //文档唯一标识
private Long id;
@Field(type = FieldType.Text,index = true,store = false,analyzer = "ik_smart",searchAnalyzer = "ik_smart")
private String title;
@Field(type= FieldType.Text,index = true,store = false,analyzer = "ik_smart",searchAnalyzer = "ik_smart")
private String content;
public Article() {
}
public Article(Long id, String title, String content) {
this.id = id;
this.title = title;
this.content = content;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
创建Dao接口继承ElasticsearchRepository
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchCrudRepository;
import java.util.List;
/**
* @Author: quanzixiong
* @Date: 2022/01/09 10:49
* 第一个标识操作的数据类型
* 第二个标识操作的数据类型的文档唯一标识的数据类型
*/
public interface ArticleDao extends ElasticsearchCrudRepository <Article,Long> {
//创建文档
//更新文档 @Highlight
//查询文档
//删除文档
//自定义查询
List<Article> findByTitle(String title);
List<Article> findByTitleAndContent(String title,String content);
@Query("{\"match\": {\"title\": {\"query\": \"?0\"}}}") //dsl语句
List<Article> abcdefg(String acdf);
}
CRUD:
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.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
@SpringBootTest
@RunWith(SpringRunner.class)
public class TestDataEs {
@Autowired
private ArticleDao articleDao;
//核心的类 操作ES的
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
//创建索引和映射
@Test
public void createIndAndMapping(){
elasticsearchTemplate.createIndex(Article.class);
elasticsearchTemplate.putMapping(Article.class);
}
//创建文档
@Test
public void createDocument(){
List<Article> articles = new ArrayList<>();
for (long i = 0; i < 100; i++) {
Article article = new Article(i, "小米手机棒棒棒" + i, "小米电话可可可" + i);
articles.add(article);
}
articleDao.saveAll(articles);
}
//更新文档
//没有id对应的数据,就是新增; 有当前id对应的数据,就是更新
//删除文档
@Test
public void delete(){
articleDao.deleteById(1L);
}
//查询文档
@Test
public void select(){
/*Iterable<Article> all = articleDao.findAll();
//分页查询
//参数1 指定排序的类型
//参数2 指定排序的字段
Sort sort = new Sort(Sort.Direction.DESC,"id");
//参数1 指定当前的页码 0 表示第一个页
//参数2 指定每页显示的行
//参数3 指定排序对象
Pageable pageble = PageRequest.of(0,10,sort);
Page<Article> page = articleDao.findAll(pageble);
long totalElements = page.getTotalElements();
System.out.println(totalElements);
int totalPages = page.getTotalPages();
System.out.println(totalPages);
System.out.println("==============");
List<Article> content = page.getContent();//当前的页的记录
for (Article article : content) {
System.out.println(article.getTitle());
}*/
//获取列表记录
/* for (Article article : all) {
System.out.println(article.getTitle());
}*/
//自定义查询
List<Article> articles = articleDao.findByTitle("手机");
for (Article article : articles) {
System.out.println(article.getTitle());
}
}
}