ElasticSearch进阶 ——与Spring Data基本整合
目录
## Spring Data ElasticSearch概述
|----基础CRUD
|----复杂查询
## Spring Data简述:
SpringData是一个用于简化数据库访问,并支持云服务的开源框架。主要目标是使得对数据的访问变得方便快捷,
可以极大的简化JPA的写法几乎不用写实现的情况下,实现对数据的访问和操作
官方网站:http://projects.spring.io/spring-data/
## Spring Data ElasticSearch概述:
基于spring data API简化Elasticsearch操作,将原始操作API进行封装,同时还为Elasticsearch项目提供集成搜索
引擎。Spring Data Elasticsearch的关键功能区域为中心的模型POJO与Elastichsearch交互文档结合轻松地编写一个
存储库数据访问层。
官方网站:http://projects.spring.io/spring-data-elasticsearch/
## 与Spring Data基本整合:
简化ES的原生操作,推荐与Spring Data JPA对照理解
技术选型:
SpringBoot + SpringDataElasticSearch
环境搭建:与SpringDataJPA类似
1.导入依赖
Spring-boot-starter-parent
-starter-web
-starter-data-elasticsearch
2.准备核心配置文件application.properties
# ES
#开启 Elasticsearch 仓库(默认值:true)
spring.data.elasticsearch.repositories.enabled=true
#默认 9300 是 Java 客户端的端口。9200 是支持 Restful HTTP 的接口
spring.data.elasticsearch.cluster‐nodes = 127.0.0.1:9300
#集群名(默认值: elasticsearch)
#spring.data.elasticsearch.cluster‐name Elasticsearch
#集群节点地址列表,用逗号分隔。如果没有指定,就启动一个客户端节点
#spring.data.elasticsearch.cluster‐nodes
#客户端的额外属性
#spring.data.elasticsearch.propertie
#连接超时的时间
spring.data.elasticsearch.properties.transport.tcp.connect_timeout=120s
3.准备启动类
@SpringBootApplication
@SpringBootApplication
public class SpringBootApplicationRunner {
public static void main(String[] args) {
SpringApplication.run(SpringBootApplicationRunner.class,args);
}
}
4.准备实体类,添加注解映射索引库信息
类上: @Document(indexName = 索引名, type = 类型)
属性上:
@Id
@Field(index=是否分词,analyzer=存储分词器,searchAnalyze=搜索分词器,store=是否存储,type=数据类型)
[注意]:
1.实体类层级应当与索引层级对应,即@Document注解中indexName项必填
2.属性注解@Id声明该文档唯一标识
@Field可省,即使用默认配置,但一旦添加该注解,所有的默认值将不再生效且type字段必填
@Document(indexName = "blog1", type = "article")
public class Article {
@Id
private Integer id;
private String title;
private String content;
...
// 此处省略get/set方法
}
5.准备持久层dao接口
extends ElasticsearchRepository<实体类, 唯一标识类型>
public interface ArticleDao extends ElasticsearchRepository<Article,Integer>{
// 复杂查询:命名规范条件查询
Page<Article> findByTitle(String str, Pageable pageable);
}
6.准备业务层service接口及实现类
业务层实现类:
@Autowired
private ArticleDao articleDao;
//保存
@Override
public void save(Article article) {
articleDao.save(article);
}
//更新
@Override
public void update(Article article) {
articleDao.save(article);
}
//删除:对象方式
@Override
public void delete(Article article) {
articleDao.delete(article);
}
//删除:Id方式
@Override
public void deleteById(int id) {
articleDao.deleteById(id);
}
//查询:所有
@Override
public Iterable<Article> findAll() {
return articleDao.findAll();
}
//复杂查询
//查询:分页
@Override
public Page<Article> findAll(Pageable pageable) {
return articleDao.findAll(pageable);
}
//查询:条件
@Override
public Page<Article> findAll(String str, Pageable pageable) {
return articleDao.findByTitle(str,pageable);
}
基础CRUD:
C:
1.创建实体类对象
2.组装文档信息属性值
3.调用service相应方法进行保存
U:操作同保存
本质上是对之前内容的覆盖
[注意]:
由于是覆盖操作,故更新后的文档内容对应更新时操作的对象,也就是说若更新时操作的对象有空的属
性值,更新后索引中相应的文档信息将不会保留之前内容而是为空
R:查询所有
调用service相应方法进行分页查询
[注意]:
框架封装的查询所有方法返回值为Iterable类型,可以通过迭代器遍历取其内容作进一步处理
D:根据对象/直接通过Id进行删除
对象方式:
1.创建实体类Article对象
2.组装所需删除文档Id
3.调用service相应方法进行删除
Id方式:
调用service相应方法并携带文档Id进行删除 测试类:
@Autowired
private ArticleService articleService;
//保存
@Test
public void saveTest(){
// 创建实体类Article对象
Article article = new Article();
// 组装文档信息属性
article.setId(1);
article.setTitle("elasticSearch 3.0版本发布...保存");
article.setContent("ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力" +
"的全文搜索引擎,基于RESTful web接口");
// 调用service相应方法进行保存
articleService.save(article);
}
//修改
@Test
public void updateTest(){
// 创建Article
Article article = new Article();
article.setId(1);
article.setTitle("elasticSearch 3.0版本发布...更新");
// 因为没有设置内容信息,故更新后的文档内容为空
articleService.update(article);
}
//删除
@Test
public void deleteTest(){
// 对象方式
Article article = new Article();
// 组装所需删除文档Id
article.setId(1);
// 调用service相应方法进行删除
articleService.delete(article);
// id方式
//articleService.deleteById(1);
}
//查询
@Test
public void findTest(){
Iterable<Article> list = articleService.findAll();
for (Article article : list) {
System.out.println(article);
}
}
复杂查询:
分页:分页 + 排序
1.准备Pageable对象,并组装分页参数及排序原则
PageReqeust.of(startIndex, size, sort);
2.调用service相应方法进行分页查询,获取Page对象
3.获取分页结果内容
.getContent();
[注意]:
查询结果不同于原生ES,默认将显示全部命中结果
条件:方法命名规范
1.需要事先在Dao层按照命名规则自定义所需的条件查询方法
2.调用service层自定义条件查询方法
[注意]:
由于是按照方法命名规则进行查询,故方法命名中的条件必须是实体类中的属性以便自动识别
@Autowired
private ArticleService articleService;
// 分页 + 排序
@Test
public void pageTest(){
Pageable pageable = PageRequest.of(0,10, Sort.by(Sort.Order.desc("id")));
Page<Article> page = articleService.findAll(pageable);
List<Article> list = page.getContent();
for (Article article : list) {
System.out.println(article);
}
}
// 分页 + 排序 + 条件
@Test
public void conditionTest(){
String str = "99";
Pageable pageable = PageRequest.of(0,10, Sort.by(Sort.Order.desc("id")));
Page<Article> page = articleService.findAll(str,pageable);
List<Article> list = page.getContent();
for (Article article : list) {
System.out.println(article);
}
}