Spring Data ElasticSearch基本使用

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));

}
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙源lll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值