pring Data ElasticSearch简介
什么是Spring Data
Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。 Spring Data可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。
Spring Data的官网:点击此处
什么是Spring Data ElasticSearch
Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API 进行封装 。Spring Data为Elasticsearch项目提供集成搜索引擎。Spring Data Elasticsearch POJO的关键功能区域为中心的模型与Elastichsearch交互文档和轻松地编写一个存储库数据访问层。
Spring Data ElasticSearch入门
导入Spring Data ElasticSearch坐标
代码语言:javascript复制 <properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.8</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.6.8</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.24</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.0.5.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>transport-netty4-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.4.RELEASE</version>
</dependency>
</dependencies>
编写实体Article
代码语言:javascript复制 private Long id;
private String title;
private String content;
编写Dao
代码语言:javascript复制public interface ArticleRepository extends ElasticsearchCrudRepository<Article,Long> {
}
配置applicationContext.xml
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/data/elasticsearch
http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd
">
<!--client客户对象的配置 -->
<elasticsearch:transport-client id="esClient" cluster-name="elasticsearch" cluster-nodes="127.0.0.1:9400"></elasticsearch:transport-client>
<!--包扫描器 扫描dao接口-->
<elasticsearch:repositories base-package="com.rpf.es.repositories"></elasticsearch:repositories>
<bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
<constructor-arg name="client" ref="esClient"></constructor-arg>
</bean>
</beans>
配置实体
基于spring data elasticsearch注解配置索引、映射和实体的关系
代码语言:javascript复制/**
* 这是一个新建的类
* 其中,注解解释如下:
* @Document(indexName="blob3",type="article"):
* indexName:索引的名称(必填项)
* type:索引的类型
* @Id:主键的唯一标识
* @Field(index=true,analyzer="ik_smart",store=true,searchAnalyzer="ik_smart",type = FieldType.text)
* index:是否设置分词
* analyzer:存储时使用的分词器
* searchAnalyze:搜索时使用的分词器
* store:是否存储
* type: 数据类型
*/
@Document(indexName = "sdes_blog",type="article")
public class Article {
@Id
@Field(type = FieldType.Long,store = true)
private long id;
@Field(type = FieldType.text,store = true,analyzer = "ik_smart")
private String title;
@Field(type = FieldType.text,store = true,analyzer = "ik_smart")
private String content;
创建测试类SpringDataESTest
代码语言:javascript复制/**
* 这是一个新建的类
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")//扫描配置文件
public class SpringDataElasticSearchTest {
@Autowired
private ArticleRepository articleRepository;
@Autowired
private ElasticsearchTemplate template;
@Test
public void creatIndex() throws Exception {
//创建索引,并配置映射关系
template.createIndex(Article.class);
//配置映射关系
// template.putMapping(Article.class);
}
Spring Data ElasticSearch的常用操作
增删改查方法测试
代码语言:javascript复制 @Test
/**
* 添加文档
*
* 跟新文档 原理:删除之后再添加 所以说更新就是在添加一个跟想更新文档id一样的文档
*/
public void addDocument() throws Exception {
for (int i = 1; i <= 10; i ) {
//创建一个article对象
Article article = new Article();
article.setId(i);
article.setTitle("工匠精神2");
article.setContent("工匠精神,是指工匠对自己的产品精雕细琢,精益求精、更完美的精神理念。工匠们喜欢不断雕琢自己的产品,不断改善自己的工艺,享受着产品在双手中升华的过程");
//把文档写入索引库
articleRepository.save(article);
}
}
@Test
/**
* 删除文档
*/
public void deleteById() throws Exception {
//根据id删除
articleRepository.deleteById(1L);
//全部删除
//articleRepository.deleteAll();
}
@Test
/**
* 不设置分页的话默认是每页显示十条
* 查询所有
*/
public void findAll() throws Exception {
Iterable<Article> articles = articleRepository.findAll();
articles.forEach(a -> System.out.println(a));
}
@Test
/**
* 查询一个
*/
public void findById() throws Exception {
Optional<Article> optional = articleRepository.findById(7l);
Article article = optional.get();
System.out.println(article);
}
自定义查询条件方法
命名符合规范 不需要实现方法 spring会为我们实现 dao层
代码语言:javascript复制public interface ArticleRepository extends ElasticsearchCrudRepository<Article,Long> {
List<Article> findByTitle(String title);//自定义条件查询
List<Article> findByTitleOrContent(String title,String Content);//自定义条件查询
List<Article> findByTitleOrContent(String title, String Content, Pageable pageable);//自定义条件查询 设置分页
}
测试
代码语言:javascript复制@Test
/**
* 自定义查询方法可以跟据搜索的内容先分词 然后进行查询
* 每个次之间条件都是 并且关系 就是 必须同时满足
* 自定义条件查询
*
*/
public void testFindByTitle() throws Exception {
List<Article> list = articleRepository.findByTitle("工匠");
// for (Article list1:list){
// System.out.println(list1);
// }
//拉姆达表达式方法
list.stream().forEach(article -> System.out.println(article));
}
@Test
/**
* 自定义根据条件查询
*/
public void testFindByTitleOrContent() throws Exception {
List<Article> list = articleRepository.findByTitleOrContent("工匠", "工匠");
for (Article list1 : list) {
System.out.println(list1);
}
}
@Test
/**
* 自定义根据条件查询
*/
public void testFindByTitleOrContent1() throws Exception {
//设置分页 page代表页数默认从0开始 size是每页显示条数
Pageable pageable = PageRequest.of(0, 7);
articleRepository.findByTitleOrContent("工匠", "工匠", pageable).forEach(a -> System.out.println(a));
}
使用Elasticsearch的原生查询对象进行查询
代码语言:javascript复制/**
*条件是或关系 满足一个即可
*
*/
@Test
public void testNativeSearchQuery() throws Exception{
//创建一个查询的对象
NativeSearchQuery query=new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.queryStringQuery("大国工匠很好").defaultField("title"))
.withPageable(PageRequest.of(0,8)).build();
//执行查询
List<Article> articleList = template.queryForList(query, Article.class);
articleList.forEach(article -> System.out.println(article));
}