实战baidu搜索的大型文档海量搜索系统
课程分类:Java
适合人群:初级课时数量:31课时
用到技术:分词、过滤、排序、索引
涉及项目:大型企业文档中心管理系统
本课程由浅入深的介绍了Lucene4的发展历史,开发环境搭建,分析lucene4的中文分词原理,深入讲了lucenne4的系统架构,分析lucene4索引实现原理及性能优化,了解关于lucene4的搜索算法优化及利用java结合lucene4实现类百度文库的全文检索功能等相对高端实用的内容,市面上一般很难找到同类具有相同深度与广度的视频,集原理、基础、案例与实战与一身,不可多得的一部高端视频教程。
讲师tom5技术背景雄厚, 国内某大型IT视频网站CTO,多年研发平台,众多大型网站及移动应用平台架构经验,并拥有多年的IT培训经验及企业内训经历。
课程使用的lucene4.3.0版本,该jar包包含有讲师示例代码。掌握它后可以从事类“百度文库”,” 豆丁网”、”校本资源库“等涉及到文章文本大字段数据查找及存储类的项目开发,前(钱)途无限。
咨询qq:1821781423
课程大纲:
一.概述:
1.1 什么是Lucene4
1.2 全文检索系统的结构
1.3 Lucene4能做什么
1.4 为什么使用Lucene4
1.5 Lucene4只关注文本的索引和搜索
1.6 索引库结构—倒排序索引
1.7 基于Lucene4的搜索程序例子
1.8 Nutch
Nutch是一个开源Java实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。
1.9 开源搜索引擎列表
JXTA Search是一个分布式的搜索系统.设计用在点对点的网络与网站上.
Carrot2是一个开源搜索结果分类引擎。它能够自动把搜索结果组织成一些专题分类。
MG4J可以让你为大量的文档集合构建一个被压缩的全文本索引,通过使内插编码(interpolative coding)技术.
1.10 全球商用搜索市场
在全球商用搜索市场上,Autonomy是老大!Autonomy的市值不足Google的零头,而Google在这一市场的份额也不足Autonomy份额的零头.
1.11 几种常见的基于Lucene4的开源搜索解决方案对比
Solr Cloud;Solandra = Solr + Cassandra ;HBasene(Lucene+HBase)
1.12 Lucene4倒排索引原理
1.13 Lucene4基本开发环境配置-样例项目概览
1.14 快速浏览demo
二、Lucene系统架构
2.1 Lucene4系统结构
2.2 Lucene4包结构功能表
2.3 Lucene4的主要逻辑图
2.3.1 查询逻辑
2.3.2 入库逻辑
2.4 理解核心索引类
2.4.1 IndexWriter
2.4.2 Directory
2.4.3 Analyzer
2.4.4 Document
2.4.5 Field
2.5 静态内部类
Field.Store ?表示Field的存储方式
2.6 关于Field的重要说明
org.apache.lucene.document.StringField A field that is indexed but not tokenized: the entire String value is indexed as a single token.
org.apache.lucene.document.TextField A field that is indexed and tokenized, without term vectors. For example this would be used on a 'body' field, that contains the bulk of a document's text.
org.apache.lucene.document.BinaryDocValuesField The values are stored directly with no sharing, which is a good fit when the fields don't share (many) values, such as a title field. If values may be shared and sorted it's better to use?SortedDocValuesField.?
2.7 项目实战动手演练
三、 Lucene索引里有什么
什么是索引 index
Lucene索引的术语定义
倒排索引(inverted indexing)
Fields的种类
片断(segments)
文档编号(document numbers)
索引结构概述
Lucene src自带样例代码
Lucene索引的目录结构
四、Lucene索引深入
4.1 Lucene4索引的目录结构
4.2 索引文件后缀名说明:segments.gen, segments_N;write.lock;.si;.cfs, .cfe ;.fnm;dex .fdx;.fdt;.tim;.tip;.doc;.pos;.pay;.nvd, .nvm;.dvd, .dvm;.tvx;.tvd;.tvf;.del
4.3 当前版本索引的限制:Lucene的当前实现索引中使用Java语言中的 int 对term词典计数。所以单个索引片段文件中词典最大的数目为: ~2.1 billion (约21亿) X 索引片段文件最大个数(128)
故 能索引的词典最大数目为: ~274 billion (约2740亿)
这个限制不是索引文件格式造成的,是采用当前java实现版本造成的。(This is technically not a limitation of the index file format, just of Lucene's current implementation.)
同理:也是使用int 对document文档源计数的。并且索引文件格式也是采用的?Int32?在硬盘上存储document文档号的。这个限制即是实现版本也是索引文件格式的限制,后续可能会改为?UInt64?或?Vint 更好就没限制了。
4.4 索引文件可放的位置
内存,硬盘
五、 Lucene索引深入优化
5.1 索引的合并
实际代码实战
5.2 索引优化的部分技巧
重用Document和Field实例
使用按照内存消耗Flush代替根据文档数量Flush(4.3版缺省)
当使用 fuzzy 查询时设置一个较小的比较长度 (prefixLength)
考虑使用filters
等等
六、Lucene索引搜索及实战
6.1 理解核心搜索类
6.2 IndexSearcher
6.2.1 基本Search方法
6.2.2 代码实战
6.3 Term
6.3.1 TermQuery
6.3.2 Hits 返回的命中结果
6.3.3 关键词搜索的大致过程
6.4 Query
6.4.1 BooleanQuery布尔搜索
使用场景说明及代码实战
6.4.2 TermRangeQuery范围搜索
使用场景说明及代码实战
6.4.3 NumericRangeQuery范围搜索
使用场景说明及代码实战
6.4.4 PrefixQuery 前缀搜索
使用场景说明及代码实战
6.4.5 PhraseQuery短语搜索
使用场景说明及代码实战
6.4.6 MultiPhraseQuery多短语搜索
使用场景说明及代码实战
6.4.7 FuzzyQuery模糊搜索
使用场景说明及代码实战
6.4.8 WildcardQuery通配符搜索
使用场景说明及代码实战
6.4.9 RegexpQuery正则表达式搜索
使用场景说明及代码实战
6.4.10 正则表达式语法
深入介绍:正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。/^\s*$/ 匹配空行。 /\d{2} \d{-5}/ 验证由两位数字、一个连字符再加 5 位数字组成的 ID 号。
/<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/ 匹配 HTML 标记。
等等详细语法指导
6.4.11 SpanQuery跨度搜索
使用场景说明及代码实战
十二、Lucene搜索深入实战进阶
QueryParser语法
一、Terms,Fields
一般来说,创建索引的分析器和查询的分析器最好保持一致(当然也有特殊情况,比如单字索引,分词组合查询),所以选择一个不会干扰查询词的分析器是很重要的。
代码实战
二、Term操作符
AND,OR,分组,特殊字符及: QueryParser.escape(q)? 可去除q中含有查询关键字的字符!如:* ,? 等
代码实战
三、模糊查询,范围查询
Lucene支持在Term中使用通配符来支持模糊查询。
范围查询是按字典查询,非“org.apache.lucene.search.NumericRangeQuery”
代码实战
四、优先级
Lucene支持给不同的查询词设置不同的权重。设置权重使用“^”符号,将“^”放于查询词的尾部,同时跟上权重值,权重因子越大,该词越重要。设置权重允许你通过给不同的查询词设置不同的权重来影响文档的相关性。
代码实战
十五、Lucene高级进阶
在索引中清除Document
maxDoc()和numDocs()
更新索引中的Document
分页搜索的实现
十八、 Lucene排序
Lucene默认按照文档得分进行排序
explain方法
加分
sort排序
十九、Lucene过滤
内置的过滤器
org.apache.lucene.search.Filter 提供了几个内置的过滤器
Direct Known Subclasses:
CachingWrapperFilter,DocTermOrdsRangeFilter,?FieldCacheRangeFilter,FieldCacheTermsFilter,?FieldValueFilter,?MultiTermQueryWrapperFilter,QueryWrapperFilter
FieldCacheRangeFilter
二十、Lucene分词器
20.1 英文分析器比较 SimpleAnalyzer; StopAnalyzer; StandardAnalyzer xy&z?mail?is?-?xyz@hello.com ,中文 SimpleAnalyzer 空格及各种符号分割:xy , z , mail , is , xyz , hello , com , 中文 StopAnalyzer
空格及各种符号分割,去掉停止词,停止词包括?is,are,in,on,the等无实际意义的词 :xy , z , mail , xyz , hello , com , 中文 StandardAnalyzer
混合分割,包括了去掉停止词,支持汉语 :xy , z , mail , xyz , hello.com , 中 , 文
代码实战
20.2 中文分词器IK Analyzer 2012介绍
在2012版本中,IK实现了简单的分词歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。
20.3 IK Analyzer 2012特性
采用了特有的“正向迭代最细粒度切分算法“,支持细粒度和智能分词两种切分模式
2012版本的智能分词模式支持简单的分词排歧义处理和数量词合并输出。
采用了多子处理器分析模式,支持:英文字母、数字、中文词汇等分词处理,兼容韩文、日文字符
优化的词典存储,更小的内存占用。支持用户词典扩展定义。特别的,在2012版本,词典支持中文,英文,数字混合词语。
20.4 IK Analyzer 2012分词效果示例
IK Analyzer 2012版本支持 细粒度切分 和 智能切分,以下是两种切分方式的演示样例。
代码实战
20.5 IK Analyzer 2012下载包内容
环境搭建,代码实战
自定义扩展词典实战
IKAnalyzer.cfg.xml(分词器扩展配置文件)
stopword.dic(停止词典)
ext.dic(自定义扩展词典词典)
常见UTF-8问题演示及解决,代码实战
20.6 高亮工具包
lucene-highlighter-4.3.0.jar
实现类似baidu搜索高亮显示关键词,及上下文的功能
代码实战
二十三、Lucene项目实战 9课时
某大型企业信息化系统中 某某文档中心管理系统
23.1 实现上传并解析全文检索各种文件类型
23.1.1 上传并解析各种格式的内容文档:(.txt,.pdf,.doc,.xls,.docx,.xlsx,.htm……)
23.1.2 Apache Tika – 文档解析工具包
org.apache.tika.parser.AutoDetectParser
23.1.3 文件上传工具包使用实战
org.apache.commons.fileupload
23.2 实现代码功能:
23.2.1 文件上传,
org.apache.commons.fileupload.servlet
实现文件上传并建立索引
23.2.2 文件下载,
实现文件点击下载
23.2.3 文件管理:文件删除,
目录管理,目录的增加、修改、删除
23.2.4 全文检索:
实现全文检索分页,
类似baidu搜索的分页实现
全文检索上下文实现摘要
org.apache.Lucene4.search.highlight.*
实现类似baidu搜索高亮显示关键词,及上下文的功能
下载地址:
百度网盘: http://pan.baidu.com/s/1jGqR2ui
360云盘:http://yunpan.cn/QiB6GSZTD6VNe (提取码:6574)