全文检索的概念
# 0.全文检索的概念
接下来我们学习全文检索技术,先介绍下什么是全文检索
# 数据的分类
计算机中的数据总体分为两种:结构化数据和非结构化数据。
- 结构化数据:格式固定、长度固定、数据类型固定。例如数据库中的数据,元数据等。
- 非结构化数据:指不定长或无固定格式的数据,如邮件,Word 文档等磁盘上的文件,PDF、邮件、HTML、txt
# 两种数据的查询
结构化数据的查询:SQL 语句,查询结构化数据的方法。简单、速度快。
非结构化数据的查询,例如从文本文件中找出包含 Spring 单词的文件,有如下方法:
使用程序把文档取到内存中,然后匹配宇符串,顺序扫描(效率很低)
把非结构化数据变成结构化数据:先跟根据空格进行字符串拆分,得到一个单词列表,基于单词列表创建一个索引。然后查询索引,根据单词和文档的对应关系找到文档列表。这个过程叫做全文检索。
索引:一个为了提高查询速度,创建某种数据结构的集合。
# 非结构化数据查询说明
例如某个目录里的所有文本文件,用代码可以这样做:
顺序扫描法(Serial Scanning)
所谓顺序扫描,比如要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。如利用 windows 的搜索也可以搜索文件内容,只是相当的慢。
全文检索(Full-text Search)
将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的然后重新组织的信息,我们称之 索引。
例如:字典。字典的拼音表和部首检字表就相当于字典的索引,对每一个字的解释是非结构化的,如果字典没有音节表和部首检字表,在茫茫辞海中找一个字只能顺序扫描。然而字的某些信息可以提取出来进行结构化处理,比如读音,就比较结构化,分声母和韵母,分别只有几种可以一一列举,于是将读音拿出来按一定的顺序排列,每一项读音都指向此字的详细解释的页数。我们搜索时按结构化的拼音搜到读音,然后按其指向的页数,便可找到我们的非结构化数据------也即对字的解释。
这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。
虽然创建索引的过程也是非常耗时的,但是索引一旦创建就可以多次使用,全文检索主要处理的是查询,所以耗时间创建索引是值得的。
# 如何实现全文检索
可以使用 Lucene 实现全文检索。Lucene 是 Apache 的一个开放源代码的全文检索引擎工具包,基于 Java 实现,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene 的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能。
像后续我们学习的 Elasticsearch 等搜索技术,基本都是用它。是搜索技术的基础。
# 全文检索的应用场景
对于数据量大、数据结构不固定的数据可采用全文检索方式搜索,比如百度、Google 等搜索引擎、论坛站内搜索、电商网站站内搜索等。
- 搜索引察:百度、360 搜索、谷歌、搜狗
- 站内搜索:论坛、微博、新闻
- 电商搜索:淘宝、京东
只要是有搜索的地方就可以使用全文检索技术。