简单介绍一下需求
- 能支持文件的上传,下载
- 要能根据关键字,搜索出文件,要求要能搜索到文件里的文字,文件类型要支持word,pdf,txt
文件上传,下载比较简单,要能检索到文件里的文字,并且要尽量精确,这种情况下很多东西就需要考虑进去了。这种情况下,我决定使用Elasticsearch来实现。
Elasticsearch简介
Elasticsearch是一个开源的搜索文献的引擎,大概含义就是你通过Rest请求告诉它关键字,他给你返回对应的内容,就这么简单。
Elasticsearch封装了Lucene,Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包。Lucene的调用比较复杂,所以Elasticsearch就再次封装了一层,并且提供了分布式存储等一些比较高级的功能。
基于Elasticsearch有很多的插件,我这次用到的主要有两个,一个是kibana,一个是Elasticsearch-head。
- kibana主要用来构建请求,它提供了很多自动补全的功能。
- Elasticsearch-head主要用来可视化Elasticsearch。
开发环境
首先安装Elasticsearch,Elasticsearch-head,kibana,三个东西都是开箱即用,双击运行。需要注意的是kibana的版本要和Elasticsearch的版本对应。
Elasticsearch-head是Elasticsearch的可视化界面,Elasticsearch是基于Rest风格的API来操作的,有了可视化界面,就不用每次都使用Get操作来查询了,能提升开发效率。
Elasticsearch-head是使用node.js开发的,在安装过程中可能会遇到跨域的问题:Elasticsearch的默认端口是9200,而Elasticsearch-head的默认端口是9100,需要改一下配置文件,具体怎么改就不详细说啦,毕竟有万能的搜索引擎。
Elasticsearch安装完成之后,访问端口,就会出现以下界面。
核心问题
有两个需要解决的核心问题,文件上传和输入关键词查询。
文件上传
首先对于txt这种纯文本的形式来说,比较简单,直接将里面的内容传入即可。但是对于pdf,word这两种特殊格式,文件中除了文字之外有很多无关的信息,比如图片,pdf中的标签等这些信息。这就要求对文件进行预处理。
Elasticsearch5.x以后提供了名为ingest node的功能,ingest node可以对输入的文档进行预处理。如图,PUT请求进入后会先判断有没有pipline,如果有的话会进入Ingest Node进行处理,之后才会正式被处理。
Ingest Attachment Processor Plugin是一个文本抽取插件,本质上是利用了Elasticsearch的ingest node功能,提供了关键的预处理器attachment。在安装目录下运行以下命令即可安装。
./bin/elasticsearch-plugin install ingest-attachment
定义文本抽取管道
PUT /_ingest/pipeline/attachment
{
"descript