Lucene课堂笔记.docx
- 文档编号:3317024
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:22
- 大小:1.50MB
Lucene课堂笔记.docx
《Lucene课堂笔记.docx》由会员分享,可在线阅读,更多相关《Lucene课堂笔记.docx(22页珍藏版)》请在冰点文库上搜索。
Lucene课堂笔记
Lucene入门
课程计划:
1、搜索引擎介绍
2、Lucene介绍
3、Lucene全文检索执行过程
4、Lucene入门程序
5、LuceneAPI详解
6、Lucene对搜素结果排名
1搜索引擎介绍
1.1搜索引擎发展史
●萌芽:
Archie、Gopher
●起步:
Robot(网络机器人)的出现与spider(网络爬虫)
●发展:
excite、galaxy、yahoo
●繁荣:
infoseek,altaVista,Google和baidu
1.2搜索的常见应用场景
应用场景:
1、单机软件的搜索(word中的搜索)
2、站内搜索(baidu贴吧、论坛、京东、taobao)
3、垂直领域的搜索(docin豆丁、拉勾、100offer)
4、专业搜索引擎公司(google、baidu)
1.3搜索数据方式
1.3.1顺序扫描法
所谓顺序扫描,例如要找内容包含一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。
这种方法是顺序扫描方法,数据量大就搜索慢。
1.3.2倒排索引
倒排索引(也称为倒排文件)是一种存储了来自文本中的映射的索引数据结构。
比如单词或者数字,对应到它们在数据库、一个文件或者一组文件中的位置。
它是在文档检索系统中使用的最流行的数据结构,在搜索引擎中有大规模使用案例
例如我们使用新华字典查询汉字,新华字典有偏旁部首的目录(索引),我们查字首先查这个目录,找到这个目录中对应的偏旁部首,就可以通过这个目录中的偏旁部首找到这个字所在的位置(文档)。
倒排索引做两件事情:
1、提取资源中关键信息,建立索引(目录)
2、搜索时,根据关键字(目录),找到资源的位置
1.4倒排索引
1.4.1相关术语
文档(Document):
一般搜索引擎处理的对象是互联网网页,对于搜索引擎来讲,Word、PDF、html、XML等不同格式的文件都可以称为文档,一般以文档来表示文本信息。
文档集合(DocumentCollection):
由若干文档构成的集合成为文档集合。
比如海量的互联网网页等。
文档编号(DocumentID):
在搜索引擎内部,会为文档集合每个文档赋予一个唯一的内部编号,以作为文档的唯一标识,以便于处理。
单词编号(WordID):
与文档编号类似,搜索引擎内部以唯一的编号来表示某个单词,以作为某个单词的唯一表示。
倒排索引(InvertedIndex):
倒排索引是实现单词——文档矩阵的一种具体存储形式。
通过倒排索引,可以根据单次快速获取包含这个单词的文档列表。
倒排索引主要由两个部分组成:
单词词典和倒排文件。
单词词典(Lexicon):
搜索引擎通常的索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引记载单词本身的一些信息及指向倒排列表的指针。
单词也就是我们在搜索时的一些关键字,也称为词条。
倒排列表(PostingList):
倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文当中出现的位置信息,每条记录成为一个倒排向(Posting)。
根据倒排列表,即可获知哪些文档包含某个单词。
倒排文件(InvertedFile):
所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即为倒排文件,倒排文件是存储倒排索引的物理文件。
1.4.2单词-文档
单词-文档矩阵的基本模型:
该矩阵模型代表的含义:
词1在文档1、文档4中出现,文档1包含了词1和词4。
词2在文档2、文档5中出现,文档2包含词2。
1.4.3创建倒排索引过程
1.4.4倒排索引(文件)
1.4.4.1基本倒排索引结构
第1列单词ID即为每个单词的编号。
第2列即为对应的单词。
第3列即为每个单词对应的倒排序表。
(比如单词“拉斯”,单词编号为8,倒排序表为{3,5},说明文档集合中文档3和文档5包含这个单词。
)
1.4.4.2复杂倒排索引结构
就编号8—拉斯—{(3:
1);(5,1)}来说,(3,1)表示“拉斯”在文档3中出现一次,(5,1)表示“拉斯”在文档5中出现1次。
1.4.4.3完整倒排索引结构
就编号8—拉斯—2—{(3;1;<4>),(5;1;<4>)}来说,文档频率2表示在两个文档出现。
“<4>”表示单词出现的位置是文档中的第4个单词。
这个倒排索引基本上是一个完备的索引系统了,实际搜索系统的索引结构基本如此。
2Lucene介绍
2.1概念
Lucene是apache下的一个开放源代码的全文检索引擎工具包。
提供了完整的查询引擎和索引引擎,部分文本分析引擎。
Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能。
●Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供
●Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻,在Java开发环境里Lucene是一个成熟的免费开放源代码工具
●Lucene并不是现成的搜索引擎产品,但可以用来制作搜索引擎产品---solr
2.2Lucene与搜索引擎的区别
全文检索系统是按照全文检索理论建立起来的用于提供全文检索服务的软件系统,包括建立索引、处理查询返回结果集、增加索引、优化索引结构等功能。
例如:
XX搜索、eclipse帮助搜索、淘宝网商品搜索等。
搜索引擎是全文检索技术最主要的一个应用,例如XX。
搜索引擎起源于传统的信息全文检索理论,即计算机程序通过扫描每一篇文章中的每一个词,建立以词为单位的倒排文件,检索程序根据检索词在每一篇文章中出现的频率和每一个检索词在一篇文章中出现的概率,对包含这些检索词的文章进行排序,最后输出排序的结果。
全文检索技术是搜索引擎的核心支撑技术。
Lucene和搜索引擎不同,Lucene是一套用java或其它语言写的全文检索的工具包,为应用程序提供了很多个api接口去调用,可以简单理解为是一套实现全文检索的类库,搜索引擎是一个全文检索系统,它是一个单独运行的软件系统
2.3为什么要学习Lucene
原来的方式实现搜索功能,我们的搜索流程如下图:
上图就是原始搜索引擎技术,如果用户比较少而且数据库的数据量比较小,那么这种方式实现搜索功能在企业中是比较常见的。
但是数据量过多时,数据库的压力就会变得很大,查询速度会变得非常慢。
我们需要使用更好的解决方案来分担数据库的压力。
现在的方案(使用Lucene),如下图
为了解决数据库压力和速度的问题,我们的数据库就变成了索引库,我们使用Lucene的API的来操作服务器上的索引库。
这样完全和数据库进行了隔离。
2.4Lucene官网
官网:
http:
//lucene.apache.org/
2.5Lucene主要包
包名
功能
org.apache.lucene.analysis
语言分析器,主要用于的切词
Lucene提供的分析器实现类在:
lucene-analyzers-common-4.10.3.jar
org.apache.lucene.document
索引存储时的文档结构管理,类似于关系型数据库的表结构
org.apache.lucene.index
索引管理,包括索引建立、删除等
org.apache.lucene.queryParser
查询分析器,实现查询关键词间的运算,如与、或、非等,生成查询表达式,
org.apache.lucene.search
检索管理,根据查询条件,检索得到结果
org.apache.lucene.store
数据存储管理,包括一些I/O操作
org.apache.lucene.util
公用类
3Lucene全文检索流程
3.1创建索引和搜索流程
1、创建索引过程,对要搜索的原始内容进行索引构建一个索引库,索引过程包括:
确定原始内容即要搜索的内容获得文档创建文档分析文档索引文档
2、红色表示搜索过程,从索引库中搜索内容,搜索过程包括:
用户通过搜索界面创建查询执行搜索,从索引库搜索渲染搜索结果
3.2创建索引过程
创建索引的过程其实就是将原始的文档数据创建索引并存储到索引库中的过程。
1、创建document对象(文档)
2、为文档添加Field
3、创建建立索引对象IndexWriter
4、将文档添加到索引库中
3.3基于索引库检索过程
1、将检索内容转成query对象
2、创建检索对象
3、通过检索对象进行检索
4、对检索的结果进行遍历
4Lucene入门程序
4.1创建索引
4.1.1导入jar包
4.1.2代码
4.1.3查看索引库内部结构
在该jar的当前目录下,打开cmd窗口,并执行以下的命令,即可打开lukeall。
overview视图说明:
document视图说明:
4.2基于索引库检索
5LuceneAPI详解
5.1创建索引的API
5.1.1Document
Lucene创建索引时的原始文档。
5.1.2IndexableField
●LongField:
long类型,会切词
●StringField:
string类型,通过StringField构建的字段不会被切词(分词)。
●TextField:
Text类型,会切词。
●newXXXField(name:
字段的名称,value:
字段的值,store:
是否存储到索引库中)
5.1.3Directory
用来指定索引库存放的位置。
●FSDirectory,指的是文件磁盘的索引路径
●RAMDirectory,指的是内存中的索引路径
5.1.4Analyzer
5.1.4.1概念
在对Docuemnt中的内容进行索引之前,需要使用分词器进行分词,分词的目的是为了搜索。
分词的主要过程就是先分词后过滤。
●分词:
采集到的数据会存储到document对象的Field域中,分词就是将Document中Field的value值切分成一个一个的词。
●过滤:
包括去除标点符号过滤、去除停用词过滤(的、是、a、an、the等)、大写转小写、词的形还原(复数形式转成单数形参、过去式转成现在式)等。
什么是停用词?
停用词是为节省存储空间和提高搜索效率,搜索引擎在索引页面或处理搜索请求时会自动忽略某些字或词,这些字或词即被称为StopWords(停用词)。
比如语气助词、副词、介词、连接词等,通常自身并无明确的意义,只有将其放入一个完整的句子中才有一定作用,如常见的“的”、“在”、“是”、“啊”等。
●注意:
搜索使用的分析器要和索引使用的分析器一致
5.1.4.2中文分词器
学过英文的都知道,英文是以单词为单位的,单词与单词之间以空格或者逗号句号隔开。
所以对于英文,我们可以简单以空格判断某个字符串是否为一个单词,比如IloveChina,love和China很容易被程序区分开来。
而中文则以字为单位,字又组成词,字和词再组成句子。
中文“我爱中国”就不一样了,电脑不知道“中国”是一个词语还是“爱中”是一个词语。
把中文的句子切分成有意义的词,就是中文分词,也称切词。
我爱中国,分词的结果是:
我、爱、中国。
●StandardAnalyzer:
单字分词:
就是按照中文一个字一个字地进行分词。
如:
“我爱中国”,
效果:
“我”、“爱”、“中”、“国”。
●CJKAnalyzer
二分法分词:
按两个字进行切分。
如:
“我是中国人”,效果:
“我是”、“是中”、“中国”“国人”
5.1.4.3第三方的中文分词器
●paoding:
庖丁解牛最新版在 中最多支持Lucene3.0,且最新提交的代码在2008-06-03,在svn中最新也是2010年提交,已经过时,不予考虑。
●mmseg4j:
最新版已从 移至 4.10,且在github中最新提交代码是2014年6月,从09年~14年一共有:
18个版本,也就是一年几乎有3个大小版本,有较大的活跃度,用了mmseg算法。
●IK-analyzer:
最新版在4.10从2006年12月推出1.0版开始,IKAnalyzer已经推出了4个大版本。
最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。
从3.0版本开始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。
在2012版本中,IK实现了简单的分词歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。
但是也就是2012年12月后没有在更新。
●ansj_seg:
最新版本在 tags仅有1.1版本,从2012年到2014年更新了大小6次,但是作者本人在2014年10月10日说明:
“可能我以后没有精力来维护ansj_seg了”,现在由”nlp_china”管理。
2014年11月有更新。
并未说明是否支持Lucene,是一个由CRF(条件随机场)算法所做的分词算法。
●imdict-chinese-analyzer:
最新版在 ,最新更新也在2009年5月,下载源码,不支持Lucene4.10。
是利用HMM(隐马尔科夫链)算法。
5.2基于索引库检索的API
5.2.1QueryParser
作用:
根据哪个字段并分词检索。
5.2.2MultiFieldQueryParser
作用:
指定多个字段检索并分词
5.2.3TermQuery
作用:
根据词条进行检索,不会切词了,因为词条已是最小单位。
5.2.4WildcardQuery
作用:
模糊检索
5.2.5FuzzyQuery
作用:
相似度检索
FuzzyQuery的构造方法:
FuzzyQuery(Termterm):
默认支持模糊字数为2;
FuzzyQuery(Termterm,intmaxEdits):
maxEdits:
模糊字数,[0,2]之间,若为0,相当于TermQuery。
FuzzyQuery(Termterm,intmaxEdits,intprefixLength):
prefixLength,指定要有多个前缀字母必须完全匹配。
5.2.6NumericRangeQuery
作用:
数字范围搜索(演示:
略),最后两个参数的含义是:
minInclusive,是否最小包含,maxInclusive,是否包含最大值
5.2.7MatchAllDocsQuery
作用:
查询所有
5.2.8BooleanQuery
作用:
组合查询
1、MUST和MUST表示“与”的关系,即“交集”,相当与AND。
2、MUST和MUST_NOT前者包含后者不包含。
3、MUST_NOT和MUST_NOT没意义
4、SHOULD与MUST表示MUST,SHOULD失去意义;
5、SHOULD与MUST_NOT相当于MUST与MUST_NOT。
6、SHOULD与SHOULD表示“或”的关系,相当与OR。
5.3更新和删除索引
6Lucene对结果排名和高亮
6.1结果排名
6.1.1Lucene文档的得分算法
idf举例:
有很多不同的数学公式可以用来计算TF-IDF。
这边的例子以上述的数学公式来计算。
词频(TF)是一词语出现的次数除以该文件的总词语数。
假如一篇文件的总词语数是100个,而词语“母牛”出现了3次,那么“母牛”一词在该文件中的词频就是3/100=0.03。
一个计算文件频率(DF)的方法是测定有多少份文件出现过“母牛”一词,然后除以文件集里包含的文件总数。
所以,如果“母牛”一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是lg(10,000,000/1,000)=4。
最后的TF-IDF的分数为0.03*4=0.12。
6.1.2改变boost值来改变文档得分
boost,激励因子,默认值是1,可以手动更改。
我们可以设置boost值来改变搜索结果排名。
而且设置boost值后,该信息保存在Document文档的norm中。
6.1.3实现排名
6.2结果高亮
6.2.1概念
结果高亮:
对结果添加HTML标签,并通过css样式修饰。
6.2.2实现
7Jsoup
网页爬取工具
是一款java的html解析器,可直接解析某个Url地址,html文本内容,有一套非常省力的api可通过dom,css以及类似于jquery的操作方法取出和操作数据
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Lucene 课堂 笔记