Spring Data ElasticSearch基本使用
Spring Data ElasticSearch简介
Spring Data ElasticSearch: Spring Data API 简化了 ElasticSearch操作,将原始操作elasticSearch的客户端API 进行封装,Spring Data为Elasticsearch项目提供集成搜索引擎。Spring Data Elasticsearch POJO的关键功能区域为中心的模型与Elastichsearch交互文档和轻松地编写一个存储库数据访问层。
环境搭建
项目结构:
1.导入相关pom.xml坐标
<!--elasticsearch相关-->
<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>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--json数据转换相关-->
<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>
<!--Spring Data elasticsearch相关-->
<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>
<!--spring测试相关-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.4.RELEASE</version>
</dependency>
2. 创建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
">
<!-- 扫描repositories包,自动创建实例对象 -->
<elasticsearch:repositories base-package="com.ly.repositories"/>
<!-- 配置elasticSearch的连接:集群名称,各节点名称 -->
<elasticsearch:transport-client id="client" cluster-nodes="localhost:9301,localhost:9302,localhost:9303" cluster-name="my-elasticsearch"/>
<!-- ElasticSearch模版对象 -->
<bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
<constructor-arg name="client" ref="client"></constructor-arg>
</bean>
</beans>
3. 编写并配置实体Article
基于spring data elasticsearch注解配置索引、映射和实体的关系
-
@Document(indexName="index_blog",type="article")
: indexName:索引名称(必项)、 type:索引类型 -
@Id
:主键的唯一标识 -
@Field(type = FieldType.text,index=true,analyzer="ik_smart",store=true,searchAnalyzer="ik_smart")
type: 数据类型
index:是否设置分词
store:是否存储
analyzer:存储时使用的分词器
searchAnalyze:搜索时使用的分词器
@Document(indexName="index_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;
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;
}
@Override
public String toString() {
return "Article{" +
"id=" + id +
", title='" + title + '\'' +
", content='" + content + '\'' +
'}';
}
}
4. 编写Repository接口
ArticleRepository属于Dao层(持久层),我们只需要实现其接口,并在xml文件中进行相应配置,spring就会自动帮我们生成对象,在生成这个接口后我们可以不用实现方法而直接使用,因为Repository接口需要继承ElasticsearchRepository<T, ID>接口,在这个里已经封装了大量的基础操作,我们可以很方便的操作ElasticSearch的数据。
代码实现:
public interface ArticleRepository extends ElasticsearchRepository<Article,Long> {
}
5.定义测试类
ElasticsearchTemplate是Spring对ES的java api进行的封装,提供了大量的相关的类来完成各种各样的查询。
/**
* @Author: Ly
* @Date: 2020-11-25 22:23
*/
//添加相关配置,在spring中测试代码
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringDataElasticSearchTest {
@Autowired
private ArticleRepository articleRepository;
@Autowired
private ElasticsearchTemplate template;
@Test
public void createIndex() throws Exception{
//创建索引,并配置映射关系
template.createIndex(Article.class);
//配置映射关系,上面的语句已经配置过索引了,不需要再配置
//template.putMapping(Article.class);
}
}
Spring Data ElasticSearch的常用操作
1. 添加文档方法测试
@Test
public void addDocument() throws Exception{
//创建Article对象
Article article =new Article();
article.setId(1);
article.setTitle("Elasticsearch简介1");
article.setContent("Elasticsearch是一个实时分布式搜索和分析引擎,用于全文搜索、结构化搜索、分析以及将这三者混合使用,Elasticsearch可以在你的笔记本上运行,也可以在数以百计的服务器上处理PB级别的数据。");
//把文档写入索引库,修改文档也同样使用这个方法,只要确定修改的文档id一样即可
articleRepository.save(article);
}
2. 删除文档方法测试
@Test
public void deleteDocumentById() throws Exception{
//通过id删除
articleRepository.deleteById(1l);
//全部删除
//articleRepository.deleteAll();
}
3. 查询文档方法测试
//在查询文档之前,可以添加一些文档
@Test
public void addDocument2() throws Exception{
for(int i=1;i<=10;i++){
//创建Article对象
Article article =new Article();
article.setId(i);
article.setTitle("Elasticsearch简介"+i);
article.setContent(i+"Elasticsearch是一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。");
//把文档写入索引库
articleRepository.save(article);
}
for(int i=11;i<=20;i++){
//创建Article对象
Article article =new Article();
article.setId(i);
article.setTitle("集群简介"+i);
article.setContent(i+"一个或多个节点组织在一起可以称做是一个集群,一个集群可以由任意多个节点组成(一般为3个节点以上),它们共同持有整个的数据,并一起提供索引和搜索功能。");
//把文档写入索引库
articleRepository.save(article);
}
}
//查询所有文档,并打印出来
@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);
}
通过自定义的方式进行查询
常用查询命名规则:
1. 测试通过文档内容查询
1.1 在ArticleRepository接口中添加相关方法:
List<Article> findByContent(String content);
1.2 测试通过文档内容查询方法
@Test
public void testFindByContent() throws Exception{
//获取查询结果
List<Article> list = articleRepository.findByContent("Elasticsearch");
//打印数据
list.stream().forEach(a-> System.out.println(a));
}
2. 测试同时查询两个域
2.1 在ArticleRepository接口中添加相关方法:
List<Article> findByTitleOrContent(String title,String content);
2.2 测试方法
@Test
public void testFindByTitleOrContent() throws Exception{
//可以对搜索的内容先分词在查询,但是每个词之间都是并且关系,必须全部包含
List<Article> list = articleRepository.findByTitleOrContent("集群","搜索引擎");
list.stream().forEach(a-> System.out.println(a));
}
3. 测试分页查询
3.1 在ArticleRepository接口中添加相关方法:
List<Article> findByContent2(String content, Pageable pageable);
3.2 测试方法
@Test
public void testfindByContent2() throws Exception{
//设置分页信息,默认从第0页开始
Pageable pageable = PageRequest.of(0,15);
list = articleRepository.findByContent2("搜索引擎",pageable);
list.stream().forEach(a-> System.out.println(a));
}
4. 构建SearchQuery查询条件,进行查询
@Test
public void testNativeSearchQuery() throws Exception{
//创建一个查询对象
NativeSearchQuery query=new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.queryStringQuery("一个好用的搜索引擎"))
.withPageable(PageRequest.of(0,15))
.build();
//执行查询
List<Article> articles = template.queryForList(query, Article.class);
articles.forEach(a-> System.out.println(a));
}
本文地址:https://blog.csdn.net/Lzy410992/article/details/110182881
上一篇: 电脑鬼出笼之《夜半妻变》(上)
下一篇: python编程(指针)代码实例
推荐阅读
-
SpringBoot + Spring Security 基本使用及个性化登录配置详解
-
spring boot使用thymeleaf为模板的基本步骤介绍
-
使用Spring Data JPA的坑点记录总结
-
Spring boot中使用Spring-data-jpa方便快捷的访问数据库(推荐)
-
Spring Cache的基本使用与实现原理详解
-
Spring Data JPA使用Sort进行排序(Using Sort)
-
详解Spring Data JPA使用@Query注解(Using @Query)
-
spring data jpa使用详解(推荐)
-
在Spring Boot中使用Spring-data-jpa实现分页查询
-
使用Spring Data JPA进行数据分页与排序