当前课程知识点:互联网大规模数据分析技术 > 第七章 Web链接分析 > 第20讲 Lucene信息检索平台 > 第20讲 Lucene信息检索平台
欢迎来到
互联网大规模数据分析技术
的课堂
我是今天的主讲教师李琳
来自武汉理工大学
今天我们开始第20讲
Lucene信息检索平台
在这一讲当中
我们首先会对Lucene
做一个简要的介绍
重点我们会讲一下
倒排索引文件Analyzer
分析机制以及查询的问题
首先我们来看一下什么是Lucene
Lucene是Apache软件基金学会的
一个开源的项目
是一个全文的检索引擎工具包
大家注意一下
它不是一个完整的引擎应用
它只是一种架构
也就是说它为软件开发人员
提供了一个简单易用的工具包
什么是全文检索呢
在前面的课程当中
大家知道了什么是信息检索
什么是Web搜索
在这里我们对全文检索
能做一个简要的回顾
在这个过程当中主要有三个步骤
第一,计算机要对文章当中的
每一个词建立一个索引
这个索引要指明该词在文件当中
出现的次数以及位置
当然这个位置信息
在索引文件当中是可选的
当索引文件构建好之后
也就是我们前面跟大家所讲的
倒排索引数据结构
用户输入查询词的时候呢
检索程序会根据先前建好的索引
进行查询
从而将查找的结果反馈给用户
这个全文是指在一篇文章当中
对所有的文字进行检索和索引的
这样一个过程
这个过程就相当于字典当中
通过字典的目录
来查找文字的这样一个过程
这是Lucene的一个版本历史
最近我们是已经到了
2014年的最新版本
从2000年开始
哪些商用的网站在用Lucene
这样一个全文检索架构呢
这里我们列出了一些
大家耳熟能详的网站
比如说Apple、美国在线
eclipse、Linkedin、IBM
那么更多大家可以到Apache的
网站上去查看更详细的列表
我们把Lucene和传统的数据库
做一个对比
在这个表中大家可以看到
我们都有索引
传统的数据库有
Lucene也有
但是Lucene的索引
是一个反向的
就是我们前面所学过的倒排索引
在我们的数据库当中
它的索引是根本用不上的
对于Like查询来说
数据库仍然要去逐个的去遍历
所有的文字
也就是说在传统的数据库中
做文本的查询仍然要
逐个逐个的去匹配
它没有这样一个倒排索引的机制
接下来我们看一下
这样一个匹配的效果
Lucene来说是以单词term
为单元来进行匹配的
而在数据库当中
它是按字符串这样一种方式
比如说像net
把一些什么样的也包含进来
这样一个词也会包含进来
也就是说它把net
作为这个单词的子串
而不是把它当做一个单词
来进行处理
接下来呢
在Lucene当中
我们前面学过了Cosine
学过了PageRank
这些都能对查询的文档
进行排序
而在传统的数据库当中
是没有匹配程度的
接下来我们再看一下
在结果的输出方面
Lucene采用了TopK的方式
也就是说我只输出前100前10
或者是前20
这个可以用用户在输入界面当中
去进行选择
但是在我们的数据库当中
它会返回所有的集合
那么当匹配的条目太多的时候
内存无法胜任这样的工作
最后我们可以看一下
我们对于不同的语言的分析
我们的Lucene都提供了接口
支持多语言的操作
数据库没有这样的接口
或者接口比较复杂
没办法去定制
这是我们对它进行了一个对比
也就是说在全文检索Lucene
这样一个开源的框架
是比较适合的
好,那我们接下来来看一下
Lucene的创新之处
在这里面我们列了一些对比
首先我们看一下索引
那么Lucene的索引即可以做
增量式的
也就是说有新的文件到来之后
我可以小批量的处理之后
再和原来的大的索引文件
进行合并
而那我们到其它的
开源检索系统当中的
这方面的支持就不大好
其次,我们的数据源
Lucene没有定义具体的数据源
也就是说一个文章的结构
它可以是灵活多样
doc、pdf
各种各样的文档格式
它都能够适用
第三对于内容的抓取
Lucene的文档虽然我们是一个
全文的非结构化的数据
但是在Lucene当中
我们仍然能够定义相关的字段
来存储一些元数据的信息
通过这样一些分析
我们可以看到Lucene
在文本处理当中有它独到之处
接下来我们看一下
当你想用Lucene来创造一个
自己的应用程序的时候
你该怎么来做呢
大家可以看到在Lucene
我们首先给一个输入给Lucene
然后Lucene才会产生一个输出
这个输入是什么呢
是你的各种各样的data
在这个里面我们就特指文本
那么这样一些文本
可以来自于哪里呢
可以来自于你自己的文件系统
可以来自于互联网
那我们把互联网引入到这来
就是我们的搜索引擎
可以是你的传统数据库
也可以人工去进行输入
当你把这样一些数据
传送到Lucene的索引机制之后
它会建立倒排索引的文件
这个时候
当用户再提出查询需求的时候
我们能够从索引的数据库当中
找到相匹配的文档
从而反馈给用户
大家在采用Lucene
这样一个架构的时候
要把数据准备好
要把分析的
这样一些机制去理顺
接下来我们看一下
Lucene这样一些优点
Lucene的文件格式
是独立于应用平台的
前面我们看到了
Lucene最关键的是索引文件
这个索引文件不管你是windows
是苹果还是任何的操作系统
它都是可以使用的
其次
这个索引文件的索引文件
它实行了分块索引
这个对于大规模的数据处理
是非常有用的
其次,Lucene设计了
独立于语言和文件格式的
文本分析接口
其实它对中文的支持也非常好的
大家有一定自然语言处理基础的
同学都会知道
中文和英文在文本的分析上面
是有很大的区别
Lucene的
这样一个倒排索引结构
前面的课程当中
我们已经进行了学习
叫做什么呢
大家已经记住了
叫Inverted index
中文我们叫倒排索引
这个倒排索引我们已经知道了
它的数据结构
前面的课程当中
我们已经进行了学习
今天我们仍然举一个例子
来帮助大家做一个回顾
在这里我有三条文本
T0、T1和T2
大家可以看一下文本的内容
这个文本当中包含了不同的单词
我们要对这些单词建立一个索引
在Lucene当中
我们是怎么来建立呢
Lucene的索引包含的信息呢
比我前面的内容稍微要多一点
大家来看,a这个单词
(2,2)代表什么意思呢
我们回过来看一下
2代表出现在文档的id
也就是T2
那么
这个第二个逗号2代表什么呢
我们的第一个单词从零开始
第二个单词四是1
第三个单词是2
也就是说
Lucene的倒排索引文件当中
不但记录了
这个单词所在的文档id
还记录了它在文档当中的位置
所以这就是
a所对应的(2,2)的含义
以此类推
banana、is、it、what
都是同样的道理
现在假设我的查询词是
what is it
按照关系
what出现在哪里呢
0、1
is出现在哪里呢
0、0、1、2
it出现在哪里呢
0、1、2
所以同时出现这三个词的文档
应该是什么
0和1
在这样一个检索过程当中
我们只用到了文本的id
我们看一下0和1
我们查询词大家还记不记得
是什么呀
what is it
what it is
因为我只考虑单词有还是没有
并没有考虑它的位置
所以T0和T1都匹配
如果在这样一个索引结构当中
我们把位置信息也考虑进来
那么我们能够实现完全的匹配
这样的情况下
只有T1是满足我们的要求
这个大家可以在课后
再具体的去思考一下
这里有一些小问题
需要大家来注意一下
对于检索系统来说
我找到结果并不是最终的目的
最终的目的是进行排序
另外,大量的搜索引擎
比如数据库的搜索引擎
是用B树的结构来维护索引
这种索引的更新
会带来很大的问题
我们看到Lucene的创新之处
也就是改进之处
Lucene会定期的
把新的小索引文件
合并到大的索引文件
这样针对不同的更新策略
批次的大小都是可以调整的
前面我们讲到了找文件的问题
找文件所建立的索引文件
在Lucene当中
究竟是一个什么样子呢
这样一个图
表示出来了它的索引文件
在我们Lucene的
开源的软件包当中
大家要注意一下
比如说我们没有tis
用于存储分词后的term
这个地方个就是的term
这个term
它有一个document frequency
也就是说它出现在了
一个文档当中
这一个文档当中它出现之后
它在这个文档当中
出现的频率是多少呢
这个单词只出现了一次
这个一次出现的位置在哪里呢
第9个单词
所以把刚才我们所讲的信息
都全部存在了
这样的数据结构当中
在Lucene当中
刚才我们主要是讲解了
如何建立索引
建立完之后我们还要进行查询
所以在这个里面大家如果要用
Lucene这个开源架构
大家要考虑一下去学习这样一些
核心的类所代表的意思
这些核心的类
它具有什么方法具有什么属性
你能存什么能放什么
这是需要大家自己和思考学习的
这里有一个demo
当然
这个demo我们是用java写的
我们简单的来看一下
首先
我们在这里要告诉Lucene
你的索引文件要放在哪里
其次你要告诉Lucene
我要用一个分析器
来进行索引文件的创建
再接下来你要告诉Lucene
你的数据在哪里
有了数据
有了索引文件存放的位置
又建立了索引文件的分析器
接下来
我们就可以对这样一个文档
进行索引的构建
在索引的构建当中你还可以给出
这个文档的一些字段
比如说内容字段
比如说文档的名字字段
比如文档存在哪个具体的位置
这些字段信息都可以存起来
便于后续再结果显示当中的使用
这是一个简单的demo
为了使用它
大家还需要把前面刚才所讲的
四个类去了解清楚
通过前面的分析可以看到
索引文件的构造
是通过Analyzer这样一个组件
来完成的
在Analyzer当中
你需要对document不同的field
去进行分析
你可以说分析field1
可以分析field2
比如说文章的title
比如说文章的内容
也可以说
某些field你不需要去分析
这些都可以通过编程来进行实现
最终把它存储在我们的
索引文件当中
当然这个类
是由Lucene已经写好了
你们只需要了解输入是什么
输出是什么
从而Lucene能够帮助你
自动去建立这样一个索引文件
这里我列出了这个字段
常用的一些属性
大家在具体的使用当中
可以查看一些手册
来完成这方面的使用和学习工作
其次
在Lucene当中呢
我们还需要
对Lucene已经建好的索引
来进行查询
这个查询就要用到这个查询类
查询完了之后呢
我们还需要将结果进行返回
大家看到这是一个top
也就是说
我只返回向前N个排名的结果
我并不是一次把所有的检索结果
都进行返回
所以接下来我们看一下查询
在Lucene当中
查询提供给了哪些
一、我们可以做
一个单词一个单词的查询
二、我们可以做前缀的查询
比如说以am开头这样的查询
我们可以做有无的这个一个查询
我们可以做这个带星号的查询
也就说我们提供了
各种各样的查询种类
当你要建立一个搜索引擎的时候
你可以考虑我给用户的查询
提供了一些什么样的查询类别
从而满足用户的信息需求
整个Lucene的包
就有这样一些内容
大家在使用Lucene包的时候
可能要去熟悉这样一些各个过程
比如说分析器、存储器
索引文件、查询、存储
以及这样各种各样的工具
大家去参考它的手册
来完成进一步的学习
最后,我们来看一下
当你获得文档之后
你要给它排序
怎么来排序呢
有印象的同学还记得
在前面的课程当
我们学习了
基于余弦夹角这样一个排序
还有基于PageRank
这样一个文档重要性的排序
在这个里面Lucene的评分机制
是什么呢
当然你可以改写这个评分机制
我们Lucene默认的评分机制是
由这样一些变量组成的
我们前面所学的tfidf
当然有同学会问我
为什么idf你加平方呢
这个是Lucene自己定的
你不喜欢可以改
还有
你可以把某个字段的权重去增加
另外这是对长度的归一化处理
同时你还可以加一些协调因子
根据你的需要
所以这样一个打分机制
大家可以重写这样一个打分机制
来完成自己的评分规则
这里Lucene
只是给一个参考作用
最后我们Lucene
只是一个工具包
如果大家要搭建企业级的
搜索服务器的时候
Lucene就显得不是那么完美
这个时候的我们的开源的组织
有这样一个Solr的项目
它是一个基于Lucene java库的
企业级搜索服务器
它的查询结果将会以XML
以及json的这样的一种格式
进行输出
它能够完成垂直的搜索
它是一个面向企业级应用的扩展
今天的课程就到这里
感谢同学们的观看
-第1讲 大数据与数据挖掘概述
-第2讲 频繁项集和关联规则的基本概念
-第3讲 Apriori算法
-第4讲 Apriori算法的改进与兴趣度度量
-第5讲 分类的基本概念
-第6讲 决策树
--第6讲 决策树
-第7讲 简单贝叶斯分类
-第8讲 聚类的基本概念
-第9讲 K-Means & K-Medoids Clustering
--第9讲 K-Means & K-Medoids Clustering
-第四章 聚类算法--习题
-第10讲 大数据处理平台Hadoop
-第11讲 MapReduce编程
-第12讲 大数据处理平台Spark
-第13讲 NoSQL数据库
-第14讲 Web信息检索简介
-第15讲 信息检索之倒排索引
-第16讲 信息检索之TFIDF
--Video
-第17讲 信息检索之相似度排序
-第18讲 Web搜索之链接分析
-第19讲 Web搜索之PageRank
-第20讲 Lucene信息检索平台
-第七章 Web链接分析--习题
-第21讲 推荐系统简介
-第22讲 推荐系统之协同过滤
-第23讲 Mahout数据挖掘平台
-第24讲 信息过滤评价体系
-第八章 推荐系统--习题一
-第八章 推荐系统--习题二
-综合编程题