【全文检索_01】核心理论

2021-01-26 15:56:06 浏览数 (1)

1.1 简介

1.1.1 什么是全文检索

  全文检索是 20世纪末产生的一种新的信息检索技术。经过几十年的发展,特别是以计算机技术为代表的新一代信息技术应用,使全文检索从最初的字符串匹配和简单的布尔逻辑检索技术演进到能对超大文本、语音、图像、活动影像等 非结构化数据 进行综合管理的复合技术。由于内涵和外延的深刻变化,全文检索系统已成为新一代管理系统的代名词,衡量全文检索系统的基本指标和全文检索的内涵也发生巨大变化。

1.1.2 数据分类

  前面我们提到了非结构化数据,那么是不是还有结构化数据,是的,我们生活中的数据总体分为两种:结构化数据和非结构化数据。他们分别又是什么样的数据呢?结构化数据指具有固定格式或有限长度的数据,如数据库中的表数据。非结构化数据:指不定长或无固定格式的数据,如文本、图片、音频等。除了这两种之外,有些书籍还有一种类型,称之为半结构化数据,如 HTML、XML。

1.2 为什么需要全文检索

1.2.1 结构化数据搜索

id

title

time

author

content

1

斗破苍穹

2009

天蚕土豆

《斗破苍穹》

2

斗罗大陆

2009

唐家三少

《斗罗大陆》

3

遮天

2010

辰东

《遮天》

4

佛本是道

2006

梦入神机

《佛本是道》

  如上表所示,这是一个数据库表 book,若我们需要查询作者为辰东的数据则使用 SELECT * FROM book WHERE author = "辰东" 即可;若我们需要查询名称中包含斗的数据则使用 SELECT * FROM book WHERE title LIKE "%斗%" 即可。当 book 中数据量变大,将所有小说都收录进去,这时搜索将变慢。我们常用分库分表、建索引来进行数据库优化。

1.2.2 什么是索引

  对列值创建排序存储,数据结构={列值、行地址}。在有序数据列表中就可以利用二分查找或其他查找方法快速找到要查找的行的地址,再根据地址直接取行数据,与在表中搜索所有的行相比,索引有助于更快地获取信息。索引的一个主要目的就是加快检索表中数据,我们一般进行全文检索时都是模糊查询,那么在数据库中的索引对于模糊查询有没有作用呢。详见 ☞ MySQL 索引

  由以上分析可知,数据库适合结构化数据的精确查询,而不适合非结构化数据的模糊查询及灵活搜索,特别是数据量大时,无法提供想要的实时性。MySQL 也提供了分词索引,在数据量不是很大时可以考虑使用这种。

1.2.3 非结构化数据搜索

☞ 顺序扫描法(Serial Scanning)

  所谓顺序扫描,比如要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。如利用windows的搜索也可以搜索文件内容,只是相当的慢。

☞ 全文检索(Full-text Search)

  将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引。

  例如:字典。字典的拼音表和部首检字表就相当于字典的索引,对每一个字的解释是非结构化的,如果字典没有音节表和部首检字表,在茫茫辞海中找一个字只能顺序扫描。然而字的某些信息可以提取出来进行结构化处理,比如读音,就比较结构化,分声母和韵母,分别只有几种可以一一列举,于是将读音拿出来按一定的顺序排列,每一项读音都指向此字的详细解释的页数。我们搜索时按结构化的拼音搜到读音,然后按其指向的页数,便可找到我们的非结构化数据——也即对字的解释。

  这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。虽然创建索引的过程也是非常耗时的,但是索引一旦创建就可以多次使用,全文检索主要处理的是查询,所以耗时间创建索引是值得的。

1.3 倒排索引

1.3.1 什么是倒排索引

  传统方法是根据文件找到该文件的内容,在文件内容中匹配搜索关键字,这种方法是顺序扫描方法,数据量大、搜索慢。而倒排索引是根据内容、词语找文档,倒排索引结构也叫反向索引结构,包括索引和文档两部分,索引即词汇表,它的规模较小,而文档集合较大。

1.3.2 分词器

  既然要根据词语来反查文档,那么可定要先提取文档中的词语,例如:中国码农,我们很自然的就将其分为 中国码农。但是计算机并不知道谁更谁在一起是一个词语,极有可能将其分为 中国国码码农。所以我们就需要一个分词器来进行分词操作。在国内我们常用分词器有 IKAnalyzer、mmseg4j。

  有人可能会问,数据库数据多了之后会变慢,难道当文档足够多时,使用分词器不会造成数据量多导致速度慢吗?是的,根据百度百科记录牛津英语词典至目前为止收录词语 61W,现代汉语词典字数加词数共 10W。这代表使用分词器分词是由数量限制的。

1.4 全文检索实现

1.4.1 Lucene

  Lucene 是 apache 软件基金会的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene 的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。

1.4.2 Elasticsearch

  Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 是用 Java 语言开发的,并作为 Apache 许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch 用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在 Java、.NET、PHP、Python、Apache Groovy、Ruby 和许多其他语言中都是可用的。根据 DB-Engines 的排名显示,Elasticsearch 是最受欢迎的企业搜索引擎。

1.4.3 Solr

  Solr 是一个高性能,采用 Java 开发,基于 Lucene 的全文搜索服务器。同时对其进行了扩展,提供了比 Lucene 更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。 在 DB-Engines 的排名中仅次于 Elasticsearch

0 人点赞