table of Contents
1. Spring Data ElasticSearch简介
(1) What is Spring Data
definition | purpose | Features |
---|---|---|
Spring Data is an open source framework for simplifying database access and supporting cloud services. | Makes access to data convenient and fast, and supports map-reduce framework and cloud computing data services | It greatly simplifies the writing of JPA, and can realize the access and operation of the data without writing the realization. In addition to CRUD, it also includes some commonly used functions such as paging and sorting. |
(2) What is Spring Data ElasticSearch
Spring Data ElasticSearch simplifies elasticSearch operations based on spring data API 将原始操作elasticSearch的客户端API 进行封装
. Spring Data provides an integrated search engine for the Elasticsearch project. Spring Data Elasticsearch POJO's key functional area-centric model interacts with Elastichsearch documents and easily writes a repository data access layer.
Spring Data ElasticSearch official website
2. Common operations of Spring Data ElasticSearch
(1) Overall steps
(2) Concrete realization
① Import es related jar package
<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>
</project>
② es related configuration
applicationContext.xml
<?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
">
<!--elastic客户端对象的配置-->
<elasticsearch:transport-client id="esClient" cluster-name="my-elasticsearch"
cluster-nodes="127.0.0.1:9301,127.0.0.1:9302,127.0.0.1:9303"/>
<!--配置包扫描器,扫描dao接口-->
<elasticsearch:repositories base-package="com.dynamic.es.repositories"/>
<!--es的模板对象-->
<bean id="elasticsearchTemplate"
class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
<constructor-arg name="client" ref="esClient"/>
</bean>
</beans>
③ Create entity
Article.java
//indexName :创建的索引的名称,type :索引的类型
@Document(indexName = "spes",type ="article")
public class Article {
//主键的唯一标识
@Id
// type: 数据类型 store:是否存储 (index:是否设置分词 analyzer:存储时使用的分词器 searchAnalyze:搜索时使用的分词器)
@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;
//此处省略get和set方法和序列化
}
④ Custom interface
ArticleRepository.java
public interface ArticleRepository extends ElasticsearchRepository<Article,Long> {
//根据标题查询
List<Article> findByTitle(String title);
//根据标题/内容查询
List<Article> findByTitleOrContent(String title, String content);
//根据标题/内容查询(含分页)
List<Article> findByTitleOrContent(String title, String content, Pageable pageable);
}
⑤ Test method
SpringDataElasticSearchText .java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringDataElasticSearchText {
@Autowired
private ArticleRepository articleRepository;
@Autowired
private ElasticsearchTemplate template;
//创建索引
@Test
public void createIndex() throws Exception{
// 创建索引,并配置映射关系
template.createIndex(Article.class);
}
//==========================增==========================
//把文档内容写入索引库
@Test
public void addDocument() throws Exception {
for (int i = 10; i <= 20; i++) {
// 创建一个Article对象
Article article = new Article();
article.setId(i);
article.setTitle("涂山红红"+i);
article.setContent("涂山红红"+i);
// 把文档内容写入索引库
articleRepository.save(article);
}
}
//==========================删==========================
//根据Id删除某条数据
@Test
public void deleteDocumentById() throws Exception{
articleRepository.deleteById(2l);
}
//==========================查(调用自定义的接口)==========================
//根据标题查询某条数据
@Test
public void testFindByTitle() throws Exception{
List<Article> list = articleRepository.findByTitle("涂山红红");
list.stream().forEach(a-> System.out.println(a));
}
//根据标题/内容查询某条数据(含分页)
@Test
public void testFindByTitleOrContext() throws Exception{
PageRequest pageable = PageRequest.of(0,15);
articleRepository.findByTitleOrContent("斗罗大陆","涂山红红",pageable)
.forEach(a-> System.out.println(a));
}
//==========================查(调用封装的方法)==========================
//查询所有内容
@Test
public void findAll() throws Exception{
Iterable<Article> articles = articleRepository.findAll();
articles.forEach(a-> System.out.println(a));
}
//根据id查询某条数据
@Test
public void testFindById() throws Exception{
Optional<Article> optional = articleRepository.findById(1l);
Article article = optional.get();
System.out.println(article);
}
//自定义查询
@Test
public void testNativeSearchQuery() throws Exception {
// 创建一个查询对象
NativeSearchQuery query = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.queryStringQuery("斗罗大陆赶紧更新吧").defaultField("title"))
.withPageable(PageRequest.of(0,15))
.build();
// 执行查询
List<Article> articleList = template.queryForList(query, Article.class);
articleList.forEach(a-> System.out.println(a));
}
}