Lucene与倒排索引概述

数据查询法

Lucene与倒排索引概述

上图就是原始搜索引擎技术,如果用户比较少而且数据库的数据量比较小,那么这种方式实现搜索功能在企业中是比较常见的。

但是数据量过多时,数据库的压力就会变得很大,查询速度会变得非常慢。我们需要使用更好的解决方案来分担数据库的压力。

Lucene与倒排索引概述

为了解决数据库压力和速度的问题,我们的数据库就变成了索引库,我们使用Lucene的API的来操作服务器上的索引库。这样完全和数据库进行了隔离。

顺序扫描法

所谓顺序扫描,例如要找内容包含一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。

优点:查询准确率高

缺点:查询速度会随着查询数据量的增大, 越来越慢

使用场景:
+ 数据库中的like关键字模糊查询
+ 文本编辑器的Ctrl + F 查询功能

倒排索引

先举一个栗子:

例如我们使用新华字典查询汉字,新华字典有偏旁部首的目录(索引),我们查字首先查这个目录,找到这个目录中对应的偏旁部首,就可以通过这个目录中的偏旁部首找到这个字所在的位置(文档)。

建立倒排索引的步骤:
1. 提取资源中关键信息, 建立索引 (目录)
2. 搜索时,根据关键字(目录),找到资源的位置算法描述:

查询前会先将查询的内容提取出来组成文档(正文), 对文档进行切分词组成索引(目录), 索引和文档有关联关系, 查询的时候先查询索引, 通过索引找文档的这个过程叫做全文检索(倒排索引也称全文索引)。

切分词 : 就是将一句一句话切分成一个一个的词, 去掉停用词(的, 地, 得, a, an, the等)。去掉空格, 去掉标点符号, 大写字母转成小写字母, 去掉重复的词。

简单一句话,以前是在文档中找词,将词和文档联系起来,就可以在词库中找词,从而找到对应的文档。

为什么倒排索引比顺序扫描快?

理解: 因为索引可以去掉重复的词, 汉语常用的字和词大概等于字典加词典, 常用的英文在牛津词典也有收录.如果用计算机的速度查询字典+词典+牛津词典这些内容是非常快的。 但是用这些字典, 词典组成的文章却是千千万万不计其数. 索引的大小最多也就是字典+词典. 所以通过查询索引, 再通过索引和文档的关联关系找到文档速度比较快. 顺序扫描法则是直接去逐个查询那些不计其数的文章,就算是计算的速度也会很慢。

优点: 查询准确率高,查询速度快,并且不会因为查询内容量的增加而使查询速度逐渐变慢

缺点: 索引文件会占用额外的磁盘空间。

使用场景: 海量数据查询

Lucence概述

Lucene是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。

Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。

目前已经有很多应用程序的搜索功能是基于 Lucene 的,比如 Eclipse 的帮助系统的搜索功能。

  • Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供
  • Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻, 在Java开发环境里Lucene是一个成熟的免费开放源代码工具
  • Lucene并不是现成的搜索引擎产品,但可以用来制作搜索引擎产品

建立索引流程

对文档索引的过程,将用户要搜索的文档内容进行索引,索引存储在索引库(index)中。

获得原始内容

原始内容是指要索引和搜索的内容。

原始内容包括互联网上的网页、数据库中的数据、磁盘上的文件等。

分析文档

首先将原始内容创建成文档(document),文档中包括一个一个的域(Field),域中存储内容。

Lucene与倒排索引概述

注意:每个Document可以有多个Field,不同的Document可以有不同的Field,同一个Document可以有相同的Field(域名和域值都相同)

将原始内容创建为包含域(Field)的文档(document),需要再对域中的内容进行分析,分析成为一个一个的单词。

比如下边的文档经过分析如下:原文档内容:

  • vivo X23 8GB+128GB 幻夜蓝 全网通4G手机
  • 华为 HUAWEI 麦芒7 6G+64G 亮黑色 全网通4G手机

分析后得到的词:

vivo, x23, 8GB, 128GB, 幻夜, 幻夜蓝, 全网, 全网通, 网通, 4G, 手机, 华为, HUAWEI, 麦芒7……

索引文档

对所有文档分析得出的语汇单元进行索引,索引的目的是为了搜索, 终要实现只搜索被索引的语汇单元从而找到Document(文档)。

创建索引是对语汇单元索引,通过词语找文档,这种索引的结构叫倒排索引结构。

倒排索引结构是根据内容(词汇)找文档,如下图:

Lucene与倒排索引概述

倒排索引结构也叫反向索引结构,包括索引和文档两部分,索引即词汇表,它的规模较小,而文档集合较大。

最后形成的存储结构即下图所示:

Lucene与倒排索引概述

查询的时候也会将查询的字符串进行切分词,然后查询。

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/lucene%e4%b8%8e%e5%80%92%e6%8e%92%e7%b4%a2%e5%bc%95%e6%a6%82%e8%bf%b0/