Lucene 深入学习(1)全文检索

时间:2021-09-26 05:54:54

前言: Lucene 是一个高性能、可伸缩的全文检索工具包。在学习Lucene之前,应该先了解一些全文检索的基本知识。

全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立索引,指明该词在文章中出现的次数和位置,当用户查询时,检索系统根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。

信息检索大约可以分为下面几类:

  • 全文检索:把用户的查询请求与文本中的词句进行匹配,找到所需信息,如Solr检索
  • 数据检索:用户的查询请求和系统中的数据都满足特定的格式,有一定的结构
  • 语义检索:用户的查询请求可以被解析成人类可识别的语义,并以此检索数据,如Google搜索

信息检索的流程

信息检索的基本流程:
1. 在搜索框中输入关键字或者文本
2. 信息检索系统从信息集合中找到相关信息,然后按照一定的顺序展示给用户

信息检索与数据库搜索

数据库检索无法达到信息检索系统的如下几个要求:
1. 匹配效果无法满足。
2. 无法根据相关性排序。
3. 毫秒级别的数据返回效率。

全文检索基本流程

信息采集

从信息源中抓取数据,得到原始信息,一般把其称之为文本库,这个文本库用来保存所有用户可能检索的信息。

信息加工(建立索引)

原始数据多而杂,我们需要对其进行处理。首先需要分词器对文本资源进行切分,将文本按规则切分为一个个可以进行索引的最小单位,然后存入索引库。索引库是一组文件的集合,它通常包含索引库位置Directory,文档Document,文档域Field。建立索引有很多种方式,如倒排,后缀数组,签名文档等。现在主流的搜索引擎都使用了“倒排”作为建立索引的方式。

全文检索

用户提交搜索请求后,该请求将被分析。进行搜索和建立索引都是需要分词器进行分词的,而且,为了保证能正确的搜索到结果,在建立索引与进行搜索时使用的分词器应是同一个。

信息采集工作常常使用爬虫工具,Python语言在这方面有着得天独厚的优势。Lucene 在全文检索过程中,做的事情就是索引(把文本分词以后存入索引库)与检索(根据条件返回结果)。

数据过滤

检索到用户数据后,还需要将数据过滤,排序返回给用户。这一步的处理关于用户体验,如果返回太多不相关的内容,可能会使用户反感。

倒排索引

全文数据的搜索主要有两种方式:顺序扫描,倒排检索。

顺序扫描(Serial Scanning)

顺序扫描就是查找包含某个字符串的文档,对于一个文档,从头检索到尾,包含该字符串,就找到了我们的期望的结果。
举个简单的例子,在浏览某个网页的时候,我知道该网页中是否有我想找的某个字词,可以按<Ctrl>+<F>键,浏览器会弹出一个框:
Lucene 深入学习(1)全文检索
输入想检索的内容,如“检索”,就会自动找到你所想查找的关键字,然后定格到关键字出现的位置,并高亮显示。如下图:
Lucene 深入学习(1)全文检索
这种方式很原始,但对于小量数据而言,却很直接。不过数据量较大时,它的反应就很慢了。

倒排索引(Inverted index)

据史料记载,人类很早以前就开始了有目的的组织信息,以便方便的查找。例如图书的目录,读者可以从目录中找到正文所在的位置(页码),快速的找到想要阅读的内容。
我们称这种由某个词来确定文档位置的反向溯源为倒排索引。

在《Lucene in Action》这本书中,有下面这幅插图,讲述了检索最重要的两个过程:创建索引,搜索索引。可以说索引(index)就是全文检索的核心。
Lucene 深入学习(1)全文检索
倒排是一种面向单词的索引机制。一般由词和其出现的位置共同组成。下面这个示意图大致演示了倒排索引的创建方式。
Lucene 深入学习(1)全文检索
你可能会认为,关键词的数量与索引大小会呈现线性关系递增,但人类的语言有限,所组成的词语也是有限的,当关键词的规模达到某一数量级后,索引文件几乎不再增长。
可以想象的是,对有限资源的关键词进行倒排,最耗时的就是建立索引的过程。但是一旦索引库构建完成,搜索时间将大幅度缩减。