Lucene学习-1

全文检索介绍

Lucene是一个全文检索的框架,全文检索又叫做全文搜索,他首先是一种搜索。大家来思考一下,我们在平时使用电脑时,哪些地方用到过搜索。这里单指普通的搜索,还不是全文检索。

现实生活中的搜索
搜索的目的是快速准确的从大段文字中快速准确的找到需要内容,我们所用到的搜索主要分为以下4种:
1)windows系统中的有搜索功能:打开“我的电脑”,按“F3”就可以使用查找的功能,查找指定的文件或文件夹。搜索的范围是整个电脑中的文件资源
2)clipse中的帮助子系统:点击Help -> Help Contents,可以查找出相关的帮助信息。搜索的范围是Eclipse的所有帮助文件,Eclipse的帮助就是用Lucene做的。
3)在BBS、BLOG、新闻等系统中提供的搜索文章的功能,如这里的贴吧的例子。搜索的范围是系统内的文章数据(都在数据库中)。
4)搜索引擎,如Baidu或Google等,可以查询到互联网中的网页、PDF、DOC、PPT、图片、音乐、视频等。搜索范围是整个互联网的网页.

对以上几种案例从搜索类型,搜索范围,搜索速度进行分析。

常见搜索 搜索类型 搜索范围 搜索速度
Windows资源管理器 文件搜索 电脑上面文件 很慢
Eclipse帮助文档搜索 全文索引搜索 帮助文档
数据库搜索 数据库搜索 数据库表
互联网搜索 全文索引搜索 互联网资源 很快

从以上分析可以看出只要是使用全文索引速度都相对较快,并且还有一下共同特征,接下来来我们就来详细看一下什么是全文索引。

全文搜索是什么?

从全文数据中进行检索就叫全文检索(全文搜索)。是基于文本的搜索。

结构化数据:指具有“固定格式”或“有限长度”的数据,如数据库,元数据等;
非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等;
半结构化数据,如XML,HTML等,当根据需要可按结构化数据来处理,也可抽取出纯文本按非结构化数据来处理。

全文数据搜索方式

顺序扫描法(Serial Scanning)
所谓顺序扫描,比如要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。比如Window自带的搜索,在数据库中扫描不带索引文本字段等。
如何提速?
之前的XP系统中搜索都非常慢,因为他采用上面的顺序扫描法,在WIN 7中为了改善这种搜索的速度,提供了如下功能:
如何提升全文检索的速度?

全文检索
非结构化数据顺序扫描很慢,对结构化数据的搜索却相对较快(由于结构化数据有一定的结构可以采取一定的搜索算法加快速度),那么把我们的非结构化数据想办法弄得有一定结构不就行了吗?关系数据库中存储的都是结构化数据,因此很检索都比较快。
在这里插入图片描述
从非结构化数据中提取出的然后重新组织的信息,我们称之索引。即为文本数据建立类似字典目录,从而提高检索速度。

全文检索的特点

相关度最高的排在最前面,官网中相关的网页排在最前面;
对摘要进行了截取;
关键词的高亮。
只关注文本,不考虑语义。
比如在输入框中输入“中国的首都在哪里”,搜索引擎不会以对话的形式告诉你“在北京”,而仅仅是列出包含了搜索关键字的网页。
在搜索引擎中查询关键词或句子时,你在最后加上问号也是没有意义的做法,会直接被过滤掉。

全文检索的使用场景

  • 替换数据库模糊查询,提高查询速度和准确度

1)数据库缺点
Where title like ‘%java%’
全文检索也是一种搜索,我们之前也学过了数据库也支持搜索,如果这两种搜索用途一致,那就没必要学习全文检索了。下面就来把全文检索和数据库来做一个对比,简述下数据库搜索的弊端。
有这样一句SQL:Select * from article where content like ‘%java%’,执行以后会有如下结果:
在这里插入图片描述
根据我们写的SQL中使用的like可以知道,这种方式在搜索时不会索引。在数据库中复制上面的SQL,在SQL前添加explain命令,代表解释这句SQL,可以看到:
查询速度慢: 这是一个全表查询,在数据库中使用like查询的字段,会按照内容顺序,逐字扫描。需要的内容越是靠后,查询的时间就越长。
搜索效果不好: 不光包含java单词的数据会被查询出来,如果内容中有JavaScript这个单词的同样也会被查询出来。如果刚好100条结果99条都包含JavaScript,只有1条是我们真正要的结果。面对这么多无用的数据,用户肯定会非常无奈。
没有相关度排序: 100条结果中,全字匹配的,和一字相差,多字相差的结果完全是混乱排列,不能把最符合的放在前面。在数据库中排序主要是按照时间,数字大小,对于内容的排序可能就开发者也摸不准是怎样的规则。
2) 具体说明
关系数据库中进行模糊查询时,数据库自带的全文索引将不起作用,此时需要通过全文检索来提高速度。
比如:网站系统中针对内容的模糊查询;
select * from article where content like ‘%源代码%’
ERP系统中产品等数据的模糊查询,BBS、BLOG中的文章搜索等;

  • 全文索引是搜索引擎的基础

各种搜索引擎运行依赖于全文检索,百度谷歌的界面看着很简单,技术主要体现在后台全文检索技术的实现上,他们自己都有基于全文检索做了实现,这些技术肯定不是开源的,不然他们在整个是市场也没啥优势了。我们要学习的Lucene是开源的,目前使用最广的全文检索工具包;

扫描二维码关注公众号,回复: 6481457 查看本文章
  • 要在word、pdf等各种各样的数据格式中检索内容

特别是pdf,能够支持搜索的主要还是指内容是文字的。搜索到关键字以后大多会以黄底或者蓝底高亮显示。

  • 其它场合:比如搜狐拼音输入法、Google输入法等

我们常用的输入法也是使用的全文检索,输入法对词库中的词都建立了目录,我们通过拼音甚至拼音首字母都可以快速找到需要的词。

全文检索应用架构

在这里插入图片描述
全文检索引擎就是一个搜索引擎,要进行搜索必须有一个数据源。在①处可以看到,我们的数据源可以来自下面四个地方:
文件系统:我们的操作系统搜索是通过顺序搜索速度相当的慢,在这也可以通过全文检索来提高搜索速度;
数据库:数据库对于文本字段的内容不能建立索引,在以后应用中也会在数据库基础上集成全文检索来提高检索速度;
互联网:目前网络中的数据量已经达到百亿单位,在搜索时能够为所有的网页建立目录也是可以提高搜索速度。
其他输入:可以直接对直接输入的内容建立索引和储存。

有了数据,目的就是为了给用户提供搜索服务。在②处用户界面主要有两个功能:
获取用户输入的搜索关键字,发送请求到后台进行处理;
响应查询,展示搜索结果。

目前我们使用的搜索引擎数据源来自互联网的其他公司,自己只提供了一个非常简单的搜索界面,感觉就是一个普通的JSP,没有什么技术含量。其实不同搜索引擎的技术主要体现在③处,我们可以看到对于索引库操作主要分为两步:
对外部数据的索引建立,必要时索引库也可以储存数据;
响应用户的搜索请求,检索结果,进行相关排序后返回到前台。

在这里插入图片描述
全文检索主要就分为索引的建立和索引的搜索,如上图所示:
索引的创建: 首先需要找到数据库源,即待索引的文件;然后进行词法分析,即分词,去停词,去标点符号,大写变小写等,语言处理主要是针对英文,时态的转变等;这些基础处理完成后就可以按一定顺序合并相同的词后生成倒排词链表;把需要储存的文件内容放入索引库中储存同时为文档生成一个编号;最后把倒排词链表和文档的编号建立关联就OK。
索引的搜索: 在获取到用户的查询语句后,同样也需要进行词法分析,语言处理,在全文检索中匹配的最小单位是词,索引索引的建立和搜索时必须使用相同的词法分析器进行分词;语法分析主要是确定符合各个词的结果间采取怎样的取舍规则,交集或并集等;然后经过步骤(d),在索引储存库中获取到每个词所对应的结果集;在搜索索引节点处按照分析规则进行结果的筛选处理;最后把结果进行相关性排序然后返回到用户界面.

猜你喜欢

转载自blog.csdn.net/PZ_eng/article/details/91973936
今日推荐