欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring Data ElasticSearch基本使用

程序员文章站 2022-05-12 16:13:32
Spring Data ElasticSearch: Spring Data API 简化了 ElasticSearch操作,将原始操作elasticSearch的客户端API 进行封装,Spring Data为Elasticsearch项目提供集成搜索引擎。Spring Data Elasticsearch POJO的关键功能区域为中心的模型与Elastichsearch交互文档和轻松地编写一个存储库数据访问层。...

Spring Data ElasticSearch简介

Spring Data ElasticSearch: Spring Data API 简化了 ElasticSearch操作,将原始操作elasticSearch的客户端API 进行封装,Spring Data为Elasticsearch项目提供集成搜索引擎。Spring Data Elasticsearch POJO的关键功能区域为中心的模型与Elastichsearch交互文档和轻松地编写一个存储库数据访问层。

环境搭建

项目结构:
Spring Data ElasticSearch基本使用

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的数据。

Spring Data 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);
}

通过自定义的方式进行查询

常用查询命名规则:

Spring Data ElasticSearch基本使用

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