Lucene搜索理论

本文介绍了数据查询的两种方法,顺序扫描法和倒排索引,强调了倒排索引在查询速度和准确性上的优势。详细阐述了倒排索引的工作原理,并以Lucene为例,解释了其在海量数据查询中的应用。Lucene作为一款全文检索引擎,用于构建索引和执行搜索,其索引和搜索流程包括文档获取、分析、索引创建和搜索执行等步骤。倒排索引结构和Lucene的使用极大提升了搜索效率。
摘要由CSDN通过智能技术生成

搜索理论基础

数据查询方法

1.顺序扫描法

算法描述:

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

优点:

  • 查询准确率高

缺点:

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

使用场景:

  • 数据库中的like关键字模糊查询
  • 文本编辑器的Ctrl + F查询功能

2.倒排索引

先举一个例子:

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

Lucene会对文档建立倒排索引

  1. 提取资源中关键信息,建立索引(目录)
  2. 搜索时,根据关键字(目录),找到资源的位置

算法描述:

  • 查询前会先将查询的内容提取出来组成文档(正文),对文档进行切分词组成索引(目录),索引和文档有关联关系,查询的时候先查询索引,通过索引找文档的这个过程叫做全文检索。
  • 切分词:就是将一句一句话切分成一个一个的词,去掉停用词(的、地、得、a、an、the等)。去掉空格,去掉标点符合,大写字母转成小写字母,去掉重复的词。

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

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

优点:

  • 查询准确率高

  • 查询速度快,并且不会因为查询内容量的增加,而使查询速度逐渐变慢

缺点:

  • 索引文件会占用额外的磁盘空间,也就是占用磁盘量会增大。

使用场景:

  • 海量数据查询

Lucene介绍

什么是全文检索

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

什么是Lucene

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

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

  • 目前已经有很多应用程序的搜索功能是基于Lucene 的,比如 Eclipse 的帮助系统的搜索功能。Lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化的文本的,Lucene 就能对你的文档进行索引和搜索。比如你要对一些 HTML 文档,PDF 文档进行索引的话你就首先需要把 HTML 文档和 PDF 文档转化成文本格式的,然后将转化后的内容交给 Lucene 进行索引,然后把创建好的索引文件保存到磁盘或者内存中,最后根据用户输入的查询条件在索引文件上进行查询。不指定要索引的文档的格式也使 Lucene 能够几乎适用于所有的搜索应用程序。

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

Lucene官网

官网: http://lucene.apache.org/

lucene全文检索的流程

索引和搜索的流程图

在这里插入图片描述
1、绿色表示索引过程,对要搜索的原始内容进行索引构建一个索引库,索引过程包括:确定原始内容既要搜索的内容

  • 获得文档
  • 创建文档
  • 分析文档
  • 索引文档

2、红色表示搜索过程,从索引库中搜索内容,搜索过程包括:
用户通过搜索界面

  • 创建查询
  • 执行搜索,从索引库搜索
  • 渲染搜索结果

索引流程

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

原始内容

原始内容是指要索引和搜索的内容。
原始内容包括互联网上的网页、数据库中的数据、磁盘上的文件等。

获得文档(采集数据)

从互联网上、数据库、文件系统中等获取需要搜索的原始信息,这个过程就是信息采集,采集数据的目的是为了对原始内容进行索引。
采集数据分类:
1、对于互联网上网页,可以使用工具将网页抓取到本地生成html文件。
2、数据库中的数据,可以直接连接数据库读取表中的数据。
3、文件系统中的某个文件,可以通过I/O操作读取文件的内容。
在Internet上采集信息的软件通常称为爬虫或蜘蛛,也称为网络机器人,爬虫访问互联网上的每一个网页,将获取到的网页内容存储起来。

创建文档

获取原始内容的目的是为了索引,在索引前需要将原始内容创建成文档(Document),文档中包括一个一个的域(Field),域中存储内容。
这里我们可以将磁盘上的一个文件当成一个document,Document中包括一些Field,如下图:
在这里插入图片描述
注意:每个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不提供制作用户搜索界面的功能,需要根据自己的需求开发搜索界面。

创建查询

用户输入查询关键字执行搜索之前需要先构建一个查询对象,查询对象中可以指定查询要查询关键字、要搜索的Field文档域等,查询对象会生成具体的查询语法,比如:
name:手机:表示要搜索name这个Field域中,内容为“手机”的文档。
name:华为AND手机:表示要搜索既包括关键字“华为”并且也包括“手机”的文档。

执行搜索

搜索索引过程:
1、根据查询语法在倒排索引词典表中分别找出对应搜索词的索引,从而找到索引所链接的文档链表。例如搜索语法为“name:华为AND手机”表示搜索出的文档中既要包括“华为”也要包括“手机”。
在这里插入图片描述
2、由于是AND,所以要对包含华为和手机词语的链表进行交集,得到文档链表应该包括每一个搜索词语
3、获取文档中的Field域数据。

渲染结果

以一个友好的界面将查询结果展示给用户,用户根据搜索结果找到自己想要的信息,为了帮助用户很快找到自己的结果,提供了很多展示的效果,如果搜索结果中将关键字高亮显示,百度提供的快照等。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值