springboot+elasticsearch实现全文检索

ElasticSearch 是一个分布式、可扩展、高性能的检索与数据分析引擎。ElasticSearch 基于 Java 编写,通过对Lucene进一步封装 ,将搜索的复杂性屏蔽起来,开发者只需要一套简单的 RESTful API 就可以操作全文检索。

1、windows环境es单节点安装
下载地址https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-9-3
下载后到指定目录解压即可,解压后的目录如下
在这里插入图片描述
进入bin目录,双击elasticsearch.bat启动即可。
在这里插入图片描述
看到started即启动成功。
默认监听的端口是9200,访问如下
在这里插入图片描述
浏览器安装插件,在chrome的app store中搜索Elasticsearch-head,点击安装即可。
在chrome 浏览器中,通过“扩展程序” 添加 elasticsearch head 插件的方式,这种方式无须开启 es的跨域访问,并提供了一个可操作es的图形化界面。
打开连接http://extb.cqttech.com/search/elasticsearch%2520head,点击安装,如下
在这里插入图片描述
访问的可视化界面如下
在这里插入图片描述
2、windows环境kibana安装
Kibana 是一个 Elastic 公司推出的一个针对 es 的分析及数据可视化平台,可以搜索、查看存放在 es 中的数据。

  • 下载地址:https://www.elastic.co/cn/downloads/kibana
  • 解压
  • 配置 es 的地址信息:若 es 是默认地址以及端口,可以不用配置,具体的配置文件是config/kibana.yml
  • 启动:双击kibana.bat即可
  • 访问localhost:5601
    界面如下
    在这里插入图片描述
    在这里插入图片描述
    Kibana 安装好之后,首次打开时,可以选择初始化 es 提供的测试数据,也可以不使用。

3、分词器
ElasticSearch 中内置了多种分词器,如Standard Analyzer:标准分词器,适用于英语等;其中中文分词器通常使用elasticsearch-analysis-ik,这个是第三方插件,下载地址如下:https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.9.3
下载后在es的plugins目录下,新建ik目录,并将解压后的所有文件拷贝到ik目录下,重启es服务。
注:es和kibana的安装路径不能有空格,否则启动会报错。
es重启成功后,首先创建一个名为test的索引(相当于是创建一个名为test的数据库),如下
在这里插入图片描述
在test索引中进行分词测试,如下
在这里插入图片描述
4、新建文档
创建索引后,向索引中添加一个文档,如下
在这里插入图片描述

  • _index表示文档索引
  • _type表示文档类型
  • _id表示文档id
  • _version表示文档版本
  • result表示执行的结果
  • _shards表示分片信息
  • _seq_no和_primary_term表示是版本控制用的
    添加文档成功后,通过浏览器插件可以看到如下
    在这里插入图片描述
    5、获取文档
    es中提供了GET API来查看es中的文档,如下
    在这里插入图片描述
    若获取的文档不存在,会返回如下
    在这里插入图片描述
    更新整个文档,如下
    在这里插入图片描述
    6、搜索
    创建索引,如下
    在这里插入图片描述
    查询文档,如下
    在这里插入图片描述
    添加文档
    在这里插入图片描述
    查询文档
    在这里插入图片描述
    或简单查询
    在这里插入图片描述
    词项查询,根据词去查询,查询指定字段中包含给定单词的文档,如下
    在这里插入图片描述
    7、全文检索
    在这里插入图片描述
    match query 会对查询语句进行分词,分此后如果查询语句中的任何一个词项被匹配,则文档就会被索引到。
    全文检索还有 match_phrase query、multi_match query、query_string query等,还有各种复杂的组合查询等,还需不断的尝试理解。

8、实例
pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ldc</groupId>
    <artifactId>springboot_elasticsearch</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot_elasticsearch</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

application.properties文件

elasticsearch.host=127.0.0.1
elasticsearch.port=9200

es配置类

@Configuration
@Data
public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {

    @Value("${elasticsearch.host}")
    private String host ;
    @Value("${elasticsearch.port}")
    private Integer port ;

    @Override
    public RestHighLevelClient elasticsearchClient() {
        RestClientBuilder builder = RestClient.builder(new HttpHost(host, port));
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);
        return restHighLevelClient;
    }
}

索引库实体类

@Data
@Document(indexName = "blog_index", type = "blog")
public class EsBlog {

    @Id
    private int id;

    /**
     * 是否索引: 看该域是否能被搜索, index = true(默认为true)
     * 是否分词: 表示搜索的时候是整体匹配还是单词匹配
     * 是否存储: 是否在页面上显示
     */
    @Field(type = FieldType.Text, analyzer = "ik_smart", searchAnalyzer = "ik_smart")
    private String title;

    @Field(type = FieldType.Text, analyzer = "ik_smart", searchAnalyzer = "ik_smart")
    private String content;

    public EsBlog() {
    }

    public EsBlog(int id, String title, String content) {
        this.id = id;
        this.title = title;
        this.content = content;
    }
}

es持久化

@Repository
public interface EsBlogRepository extends ElasticsearchRepository<EsBlog, Integer> {
    /**
     * 根据title或者内容分页查询
     *
     * @param title   标题
     * @param content 内容
     * @param page    分页
     * @return
     */
    Page<EsBlog> findByTitleOrContentLike(String title, String content, Pageable page);
}

es服务

@Service
public class EsBlogServiceImpl implements EsBlogService {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Resource
    private EsBlogRepository esBlogRepository;

    @Resource
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    @Override
    public void save(EsBlog blog) {
        esBlogRepository.save(blog);
        logger.debug("save ok");
    }
    @Override
    public void save(List<EsBlog> blogs) {
        esBlogRepository.saveAll(blogs);
        logger.debug("save ok");
    }

    @Override
    public void delete(int id) {
        esBlogRepository.deleteById(id);
    }

    @Override
    public EsBlog getById(int id) {
        EsBlog esBlog = esBlogRepository.findById(id).orElse(new EsBlog());
        logger.debug(esBlog.toString());
        return esBlog;

    }

    @Override
    public Page<EsBlog> getByKey(String key, Pageable pageable) {
        if(StringUtils.isEmpty(key)){
            return esBlogRepository.findAll(pageable);
        }
        return esBlogRepository.findByTitleOrContentLike(key, key, pageable);
    }

    @Override
    public Page<EsBlog> getByKeyWord(String key, Pageable pageable) {
        if(StringUtils.isEmpty(key)){
            System.out.println("key is null");
        }
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(matchQuery("title", key))
                .withQuery(matchQuery("content", key))
                .withPageable(pageable)
                .build();
        Page<EsBlog> esBlogs = elasticsearchRestTemplate.queryForPage(searchQuery, EsBlog.class);
        esBlogs.forEach(e -> logger.debug(e.toString()));
        return esBlogs;
    }
}

es接口

@RestController
@RequestMapping("blog")
public class EsBlogController {

    @Resource
    private EsBlogService searchService;

    @GetMapping("init")
    private String initBlog() {
        List<Blog> blogs = new ArrayList<>();
        blogs.add(new Blog(1, "java", "java编程语言"));
        blogs.add(new Blog(2, "netty", "netty编程"));
        List<EsBlog> esBlogs = new ArrayList<>();
        blogs.forEach(blog -> {esBlogs.add(new EsBlog(blog.getId(), blog.getTitle(), blog.getContent()));});
        searchService.save(esBlogs);
        return "init Success";
    }

    /**
     * @param blog 博客文档
     * @return
     */
    @PostMapping("save")
    public void save(EsBlog blog) {
        searchService.save(blog);
    }

    /**
     * @param id 文档id
     * @return
     */
    @GetMapping("getById")
    public Object getById(int id) {
        return searchService.getById(id);
    }

    /**
     * @param key 关键字
     * @return
     */
    @GetMapping("getByKey")
    public Page<EsBlog> getByKey(HttpServletRequest request, String key) {
        Pageable pageable = getPageByRequest(request);
        return searchService.getByKey(key, pageable);
    }

    /**
     * @param key 关键字
     * @return
     */
    @GetMapping("getByKeyWord")
    public Page<EsBlog> getByKeyWord(HttpServletRequest request, String key) {
        Pageable pageable = getPageByRequest(request);
        return searchService.getByKeyWord(key, pageable);
    }

    private Pageable getPageByRequest(HttpServletRequest request) {
        int page = StringUtils.isEmpty(request.getParameter("page")) ? 1 : Integer.parseInt(request.getParameter("page"));
        int size = StringUtils.isEmpty(request.getParameter("size")) ? 10 : Integer.parseInt(request.getParameter("size"));
        Pageable pageable = PageRequest.of(page - 1, size);
        return pageable;
    }
}

检索示例如下
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot是一个基于Java的开源框架,用于快速构建独立的、生产级别的应用程序。它简化了Spring框架的开发过程,提供了大量的默认配置,开发者只需关注业务逻辑的实现即可。 Elasticsearch是一个开源的分布式搜索和分析引擎,它使用倒排索引的方式进行高效的文本搜索。它提供了丰富、强大的查询语言和API,可以帮助我们构建高性能、可扩展的搜索应用。 要构建一个博客检索系统,可以使用Spring BootElasticsearch的组合。首先,我们可以使用Spring Boot搭建一个简单的web应用,用于展示博客内容和处理用户请求。Spring Boot提供了快速开发的能力,可以方便地构建页面和处理数据。 然后,我们需要将博客的内容导入到Elasticsearch中进行索引。可以编写一个程序,通过Elasticsearch提供的API将博客内容导入到索引中。这样,我们就可以通过Elasticsearch的查询语言来搜索博客文章。 最后,我们可以在Spring Boot应用中编写一个搜索接口,通过接收用户的搜索关键字,调用Elasticsearch的API进行查询,并将查询结果返回给用户。用户可以根据搜索结果点击进入详细页面查看博客内容。 构建博客检索系统需要注意索引的更新问题,当博客内容发生变化时,需要及时同步到Elasticsearch的索引中,以确保数据的最新性。可以使用定时任务或者监听数据库变化的方式实现索引的更新。 总结来说,使用Spring BootElasticsearch可以快速构建一个博客检索系统。Spring Boot提供了便捷的开发环境,而Elasticsearch提供了强大的搜索和分析引擎,帮助我们实现高性能的搜索功能。 ### 回答2: Spring Boot是一个用于简化Spring应用开发的框架,它通过提供默认的配置和约定来简化Java应用程序的开发过程。Elasticsearch是一个开源的分布式搜索和分析引擎,可以高效地存储、检索和分析大量结构化和非结构化数据。 通过使用Spring BootElasticsearch,我们可以构建一个免费的博客检索系统。首先,我们可以使用Spring Boot框架来开发一个简单的博客应用,在其中包括博客的标题、内容、作者和发布时间等基本信息。我们可以使用Spring Data Elasticsearch来集成Elasticsearch搜索功能,并将博客的相关信息存储在Elasticsearch的索引中。 接下来,我们可以利用Elasticsearch的强大的搜索和查询功能来构建一个可靠和高效的博客检索系统。通过对博客索引进行全文搜索,用户可以根据关键词搜索博客,系统会返回与关键词相关的博客内容。 除了基本的搜索功能,我们还可以通过利用Elasticsearch的聚合功能来实现更复杂的检索需求。例如,我们可以计算某个时间段内博客的发布数量,或者根据作者分组计算每个作者的博客数量。这些聚合操作可以帮助我们快速获取博客数据的统计信息,以实现更细粒度的博客检索。 总之,利用Spring BootElasticsearch,我们可以构建一个免费的博客检索系统,提供强大的全文搜索和聚合功能,帮助用户快速找到他们感兴趣的博客内容。这个系统不仅易于开发和维护,还能够处理大量的博客数据,提供稳定和高效的检索服务。 ### 回答3: Spring Boot是一种用于快速开发Java应用程序的框架,而Elasticsearch是一个开源的分布式搜索引擎。结合两者,可以构建一个强大的博客检索系统。 首先,我们可以使用Spring Boot框架来构建博客系统的后端。通过使用Spring Boot的自动配置和约定优于配置的设计原则,我们可以快速搭建一个可靠的后端应用程序。我们可以使用Spring MVC来处理前端请求,并使用Spring Data来与数据库进行交互和管理数据。通过使用Spring Security可以确保博客系统的安全性。 其次,我们需要集成Elasticsearch作为博客系统的搜索引擎。Elasticsearch是一个分布式的实时搜索和分析引擎,具有强大的全文搜索能力和高性能。我们可以通过使用Spring Data Elasticsearch模块来简化与Elasticsearch的交互,它提供了丰富的API来执行各种搜索操作。 在博客系统中,我们可以使用Elasticsearch建立博客的全文索引。当用户进行搜索时,我们可以使用Elasticsearch的查询语言来执行搜索操作,并返回与查询相关的博客文章。我们可以使用Elasticsearch的分词、关键字匹配和模糊搜索等功能来提高搜索的准确性和效率。 为了提升用户体验,我们可以使用Elasticsearch的聚合功能来生成搜索建议和热门标签等。这样用户可以更方便地找到他们想要的博客内容。 综上所述,通过免费课程学习Spring BootElasticsearch,我们可以构建一个功能强大的博客检索系统。这将使用户能够轻松搜索并获取他们所需的博客文章。同时,使用Spring BootElasticsearch的优势,我们可以快速开发和部署这个系统,并保证其可靠性和性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值