当前位置 主页 > 服务器问题 > Linux/apache问题 >

    springboot集成ES实现磁盘文件全文检索的示例代码

    栏目:Linux/apache问题 时间:2019-11-15 16:21

    最近有个朋友咨询如何实现对海量磁盘资料进行目录、文件名及文件正文进行搜索,要求实现简单高效、维护方便、成本低廉。我想了想利用ES来实现文档的索引及搜索是适当的选择,于是就着手写了一些代码来实现,下面就将设计思路及实现方法作以介绍。

    整体架构

    考虑到磁盘文件分布到不同的设备上,所以采用磁盘扫瞄代理的模式构建系统,即把扫描服务以代理的方式部署到目标磁盘所在的服务器上,作为定时任务执行,索引统一建立到ES中,当然ES采用分布式高可用部署方法,搜索服务和扫描代理部署到一起来简化架构并实现分布式能力。

    磁盘文件快速检索架构

    部署ES

    ES(elasticsearch)是本项目唯一依赖的第三方软件,ES支持docker方式部署,以下是部署过程

    docker pull docker.elastic.co/elasticsearch/elasticsearch:6.3.2
    docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name es01 docker.elastic.co/elasticsearch/elasticsearch:6.3.2

    部署完成后,通过浏览器打开http://localhost:9200,如果正常打开,出现如下界面,则说明ES部署成功。

    ES界面

    工程结构

    工程结构

    依赖包

    本项目除了引入springboot的基础starter外,还需要引入ES相关包

      <dependencies>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
          <groupId>io.searchbox</groupId>
          <artifactId>jest</artifactId>
          <version>5.3.3</version>
        </dependency>
        <dependency>
          <groupId>net.sf.jmimemagic</groupId>
          <artifactId>jmimemagic</artifactId>
          <version>0.1.4</version>
        </dependency>
      </dependencies>

    配置文件

    需要将ES的访问地址配置到application.yml里边,同时为了简化程序,需要将待扫描磁盘的根目录(index-root)配置进去,后面的扫描任务就会递归遍历该目录下的全部可索引文件。

    server:
     port: @elasticsearch.port@
    spring:
     application:
      name: @project.artifactId@
     profiles:
      active: dev
     elasticsearch:
      jest:
       uris: http://127.0.0.1:9200
    index-root: /Users/crazyicelee/mywokerspace
    

    索引结构数据定义

    因为要求文件所在目录、文件名、文件正文都有能够检索,所以要将这些内容都作为索引字段定义,而且添加ES client要求的JestId来注解id。

    package com.crazyice.lee.accumulation.search.data;
    
    import io.searchbox.annotations.JestId;
    import lombok.Data;
    
    @Data
    public class Article {
      @JestId
      private Integer id;
      private String author;
      private String title;
      private String path;
      private String content;
      private String fileFingerprint;
    }