全文检索技术被普遍的应用于搜索引擎,查询检索等领域。咱们在网络上的大部分搜索服务都用到了全文检索技术。java
对于数据量大、数据结构不固定的数据可采用全文检索方式搜索,好比百度、Google等搜索引擎、论坛站内搜索、电商网站站内搜索等。sql
什么是全文检索呢?先看一下百度百科的专业定义。数据库
为了能更好的理解,咱们先看一个简单的例子。apache
实现一个文件的搜索功能,经过关键字搜索文件,凡是文件名或文件内容包括关键字的文件都须要找出来。还能够根据中文词语进行查询,而且须要支持多个条件查询。编程
本案例中的原始内容就是磁盘上的一些示例文件,以下图:windows
若是用数据库实现的话,数据库中的搜索很容易实现,一般都是使用sql语句进行查询,并且能很快的获得查询结果。api
为何数据库搜索很容易?服务器
由于数据库中的数据存储是有规律的,有行有列并且数据格式、数据长度都是固定的。网络
可是,咱们生活中的数据整体是分为两种的:结构化数据和非结构化数据。数据结构
结构化数据:指具备固定格式或有限长度的数据,如数据库,元数据等。
非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等磁盘上的文件
结构化数据的查询咱们能够经过sql搞定,那么非结构化的呢?
非结构化数据查询有两种办法:
(1)顺序扫描法(Serial Scanning)
所谓顺序扫描,好比要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每个文档,从头看到尾,若是此文档包含此字符串,则此文档为咱们要找的文件,接着看下一个文件,直到扫描完全部的文件。如利用windows的搜索也能够搜索文件内容,只是至关的慢。
(2)全文检索(Full-text Search)
将非结构化数据中的一部分信息提取出来,从新组织,使其变得有必定结构,而后对此有必定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的而后从新组织的信息,咱们称之索引。
例如:字典。字典的拼音表和部首检字表就至关于字典的索引,对每个字的解释是非结构化的,若是字典没有音节表和部首检字表,在茫茫辞海中找一个字只能顺序扫描。然而字的某些信息能够提取出来进行结构化处理,好比读音,就比较结构化,分声母和韵母,分别只有几种能够一一列举,因而将读音拿出来按必定的顺序排列,每一项读音都指向此字的详细解释的页数。咱们搜索时按结构化的拼音搜到读音,而后按其指向的页数,即可找到咱们的非结构化数据——也即对字的解释。
这种先创建索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。
虽然建立索引的过程也是很是耗时的,可是索引一旦建立就能够屡次使用,全文检索主要处理的是查询,因此耗时间建立索引是值得的。
那么如何实现全文检索呢?
提到全文检索,不得不提到的一个技术就是Lucene,Lucene是apache下的一个开放源代码的全文检索引擎工具包。提供了完整的查询引擎和索引引擎,部分文本分析引擎。咱们所熟知的全文检索引擎Solr和ES都是基于Lucene的。
一、绿色表示索引过程,对要搜索的原始内容进行索引构建一个索引库,索引过程包括:
肯定原始内容即要搜索的内容->采集文档->建立文档->分析文档->索引文档
二、红色表示搜索过程,从索引库中搜索内容,搜索过程包括:
用户经过搜索界面->建立查询->执行搜索,从索引库搜索->渲染搜索结果
也就是对文档索引的过程,将用户要搜索的文档内容进行索引,索引存储在索引库(index)中。
好比刚才的这些文档:
咱们要分析其中全部的单词,将单词、文档名创建映射关系。
(对于单词的切分包括了对原始文档提取单词、去除停用词等过程,这个过程被称为分词)
咱们分析其中的一篇文档Lucene.txt:
原文档内容:
Lucene is a Java full-text search engine. Lucene is not a complete
application, but rather a code library and API that can easily be used
to add search capabilities to applications.
咱们能够分析后获得语汇单元:
lucene、java、full、search、engine。。。。
另外一个文档flink.txt加入几个单词:
java flink kakfa
咱们也能够获得语汇单元:
java flink kakfa
这样咱们就创建了映射关系,lucene、java、full、search在Lucene.txt中,而flink不在Lucene.txt中,可是在flink.txt中。java即在Lucene.txt中,也在flink.txt中。
那当咱们查找lucene这个词,就在Lucene.txt中,可是查找java时能够获悉其在这两个文件中。
建立索引是对语汇单元索引,经过词语找文档,这种索引的结构就叫作叫倒排索引结构。
传统方法是根据文件找到该文件的内容,在文件内容中匹配搜索关键字,这种方法是顺序扫描方法,数据量大、搜索慢。
倒排索引结构是根据内容(词语)找文档,以下图:
倒排索引结构也叫反向索引结构,包括索引和文档两部分,索引即词汇表,它的规模较小,而文档集合较大。
有倒排索引,对应确定,有正向索引。 正向索引其实就是顺序扫描全部文件,这样自己效率是极低的。
查询索引也是搜索的过程。搜索就是用户输入关键字,从索引(index)中进行搜索的过程。根据关键字搜索索引,根据索引找到对应的文档,从而找到要搜索的内容(这里指磁盘上的文件)。
咱们这里就是经过查询索引表,找到文档所在的位置,就完成了查询,但其余的场景能够灵活的把查询出来的结果展现出去,好比咱们的百度搜索时,为咱们展现的是相关网页。
手动去开发创建索引和查询索引的功能须要大量的工做,好在lucene已经帮咱们完成了大量的工做,只须要调用java api就能够完成相关工做。
可是Lucene的API过于底层,并不简单易用,并且缺少企业级的管理工具对其进行监控管理,因而企业级的全文检索引擎就应运而生了,目前最流行的两个就是:Solr和ES。他们都是创建在Lucene之上的。
Solr是Apache Lucene项目的开源企业搜索平台。Solr是高度可扩展的,并提供了分布式搜索和索引复制。
Solr由Java开发,运行在Servlet容器中,是一个独立的全文搜索服务器。并具备强大的API和外部配置功能,使得无需编码,即可对其调整以适应多种类型应用。
2010年Apache Lucene与Apache Solr项目合并,因此Lucene/Solr成为了Apache一个项目。
因而可知,Solr的优点就是:
有一个成熟的开发者社区;本省比较稳定;支持多种格式的索引。
可是因为底层机制的限制,Solr的缺点也很明显:
创建索引时,搜索效率降低;实时索引搜索效率不高。
ES也就是Elasticsearch,是一个实时的分布式搜索和分析引擎,它能够用于全文搜索,结构化搜索以及分析。
因为Lucene过于复杂,不方便使用。Elasticsearch使用Lucene做为内部引擎,可是Elasticsearch作搜索引擎时,只须要使用同一的API就能够,而不须要了解复杂的Lucene原理。
并且Elasticsearch不只仅能够作全文搜索功能,在企业中能够做为:
Elasticsearch的Restful API友好并且简单,特别容易上手。
目前包括维基百科、Stackoverflow、Github等都是用Elasticsearch做为其搜索引擎。
这里咱们简单使用一个ES完成一个全文检索功能。
首先在官网下载 ,官网地址:https://www.elastic.co/products/elasticsearch
下载地址以下:https://www.elastic.co/cn/downloads/elasticsearch
选择本身系统的咱们这选择WIndows版本。
同时咱们能够下载kibana,kibana是配合ES的一个可视化工具。
解压 放在d盘
随后咱们在命令行启动:
C:\Users\JN>d: D:>cd D:\elasticsearch-6.4.0>cd bin D:\elasticsearch-6.4.0\bin>elasticsearch.bat
kibana也是
C:\Users\JN>d: D:>cd kibana-6.4.0-windows-x86_64 D:\kibana-6.4.0-windows-x86_64>cd bin D:\kibana-6.4.0-windows-x86_64\bin>kibana.bat
部署成功: 能够经过localhost:9200访问es
localhost:5601访问kibana
咱们简单体验一下ES,打开kibana的DevTools工具。
分别插入两条数据,并进行搜索。
使用编程语言调用ES也与这个相似,简单易用。
参考文档:
lucene in action
Elasticsearch权威指南
更多ES,Flink,Kafka等实时流式计算的博文,欢迎关注实时流式计算: