Spring Boot中整合Elasticsearch实现全文检索

夏日蝉鸣 2022-01-21 ⋅ 35 阅读

在现代化的互联网应用中,全文检索功能已经成为了必备的一项功能。而Elasticsearch作为目前最受欢迎的开源搜索引擎,以其强大的全文搜索和分布式特性而备受开发者青睐。本文将介绍如何在Spring Boot应用中使用Elasticsearch实现全文检索功能。

准备工作

在开始使用Elasticsearch之前,我们首先需要安装Elasticsearch并创建一个索引。Elasticsearch的安装非常简单,只需要下载对应版本的压缩包并解压即可。解压后进入解压目录,运行bin/elasticsearch脚本即可启动Elasticsearch。

在Elasticsearch中,索引相当于数据库中的表,所以在使用Elasticsearch进行全文检索之前,我们需要先创建一个索引。打开命令行终端,运行以下命令创建一个名为blog_index的索引:

curl -X PUT "localhost:9200/blog_index?pretty"

添加Elasticsearch依赖

在开始之前,我们首先需要在pom.xml文件中添加Elasticsearch的依赖。Spring Boot提供了一个名为spring-boot-starter-data-elasticsearch的starter,它包含了Elasticsearch的相关依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

配置Elasticsearch连接

在使用Elasticsearch之前,我们需要先配置Elasticsearch的连接信息。在application.properties文件中添加以下配置:

spring.data.elasticsearch.cluster-nodes=localhost:9300

定义实体类

接下来,我们需要定义一个实体类,并使用Spring Data Elasticsearch的注解来映射实体类和Elasticsearch中的文档。例如,我们创建一个名为Blog的实体类:

import org.springframework.data.elasticsearch.annotations.Document;

@Document(indexName = "blog_index", type = "blog")
public class Blog {
    private String title;
    private String content;

    // 省略 getter 和 setter 方法
}

@Document注解中,indexName表示要操作的索引名,type表示要操作的文档类型。

定义Repository接口

接下来,我们需要定义一个Repository接口,继承自ElasticsearchRepositoryElasticsearchRepository是Spring Data Elasticsearch提供的一个接口,它提供了一些基本的Elasticsearch操作方法。

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

public interface BlogRepository extends ElasticsearchRepository<Blog, String> {
}

在Repository接口中,我们只需要定义一些基本的CRUD方法即可。Spring Data Elasticsearch会自动根据方法名生成对应的Elasticsearch查询语句。

编写全文检索方法

最后,我们可以在Service层中编写全文检索的方法。在Spring Data Elasticsearch中,提供了一个search方法用于执行全文检索操作。我们可以通过给方法添加@Query注解来指定要执行的查询语句。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.stereotype.Service;

@Service
public class BlogService {
    @Autowired
    private BlogRepository blogRepository;

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    public List<Blog> searchBlog(String keyword) {
        String query = "{\"query\":{\"match\":{\"content\":\"" + keyword + "\"}}}";

        NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.wrapperQuery(query))
                .build();

        return elasticsearchTemplate.queryForList(searchQuery, Blog.class);
    }
}

searchBlog方法中,我们使用QueryBuilders.wrapperQuery方法创建一个查询构造器,并传入查询语句。接下来,我们可以使用elasticsearchTemplate.queryForList方法执行查询,该方法会返回一个包含查询结果的List。

测试全文检索方法

现在我们可以编写一个简单的测试方法来测试全文检索功能。在测试方法中,我们调用searchBlog方法并输出结果。

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BlogServiceTest {
    @Autowired
    private BlogService blogService;

    @Test
    public void testSearchBlog() {
        String keyword = "spring boot";
        List<Blog> blogs = blogService.searchBlog(keyword);
        blogs.forEach(blog -> System.out.println(blog.getTitle()));
    }
}

运行测试方法,你将会看到包含关键字"spring boot"的博客标题。

至此,我们已经成功地使用Elasticsearch实现了全文检索功能。尽管本文只是一个简单的例子,但它能帮助你快速了解如何在Spring Boot应用中整合Elasticsearch并实现全文检索。希望本文能为你提供一些参考和帮助!


全部评论: 0

    我有话说: