一.概述:
1.1 什么是Lucene4
1.2 全文檢索系統(tǒng)的結(jié)構(gòu)
1.3 Lucene4能做什么
1.4 為什么使用Lucene4
1.5 Lucene4只關(guān)注文本的索引和搜索
1.6 索引庫結(jié)構(gòu)—倒排序索引
1.7 基于Lucene4的搜索程序例子
1.8 Nutch
Nutch是一個開源Java實現(xiàn)的搜索引擎。它提供了我們運行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬蟲。
1.9 開源搜索引擎列表
JXTA Search是一個分布式的搜索系統(tǒng).設(shè)計用在點對點的網(wǎng)絡(luò)與網(wǎng)站上.
Carrot2是一個開源搜索結(jié)果分類引擎。它能夠自動把搜索結(jié)果組織成一些專題分類。
?MG4J可以讓你為大量的文檔集合構(gòu)建一個被壓縮的全文本索引,通過使內(nèi)插編碼(interpolative coding)技術(shù).
1.10 全球商用搜索市場
在全球商用搜索市場上,Autonomy是老大!Autonomy的市值不足Google的零頭,而Google在這一市場的份額也不足Autonomy份額的零頭.
1.11 幾種常見的基于Lucene4的開源搜索解決方案對比
Solr Cloud;Solandra = Solr + Cassandra ;HBasene(Lucene+HBase)
1.12 Lucene4倒排索引原理
1.13 Lucene4基本開發(fā)環(huán)境配置-樣例項目概覽
1.14 快速瀏覽demo
?
二、Lucene系統(tǒng)架構(gòu)?
2.1 Lucene4系統(tǒng)結(jié)構(gòu)
2.2 Lucene4包結(jié)構(gòu)功能表?
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 靜態(tài)內(nèi)部類
Field.Store ?表示Field的存儲方式
2.6 關(guān)于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 項目實戰(zhàn)動手演練
?
三、 Lucene索引里有什么
什么是索引 index
Lucene索引的術(shù)語定義
倒排索引(inverted indexing)
Fields的種類
片斷(segments)
文檔編號(document numbers)
索引結(jié)構(gòu)概述
Lucene src自帶樣例代碼
Lucene索引的目錄結(jié)構(gòu)
?
四、Lucene索引深入
4.1 Lucene4索引的目錄結(jié)構(gòu)
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的當前實現(xiàn)索引中使用Java語言中的 int 對term詞典計數(shù)。所以單個索引片段文件中詞典大的數(shù)目為: ~2.1 billion ?(約21億) ?X ?索引片段文件大個數(shù)(128)
故 能索引的詞典大數(shù)目為: ~274 billion (約2740億)
這個限制不是索引文件格式造成的,是采用當前java實現(xiàn)版本造成的。(This is technically not a limitation of the index file format, just of Lucene's current implementation.)
同理:也是使用int 對document文檔源計數(shù)的。并且索引文件格式也是采用的?Int32?在硬盤上存儲document文檔號的。這個限制即是實現(xiàn)版本也是索引文件格式的限制,后續(xù)可能會改為?UInt64?或?Vint 更好就沒限制了。
4.4 索引文件可放的位置
內(nèi)存,硬盤
?
五、 Lucene索引深入優(yōu)化
5.1 索引的合并
實際代碼實戰(zhàn)
5.2 索引優(yōu)化的部分技巧
重用Document和Field實例
使用按照內(nèi)存消耗Flush代替根據(jù)文檔數(shù)量Flush(4.3版缺?。?/p>
當使用 fuzzy 查詢時設(shè)置一個較小的比較長度 (prefixLength)?
考慮使用filters?
等等
?
六、Lucene索引搜索及實戰(zhàn)
6.1 理解核心搜索類?
6.2 IndexSearcher
6.2.1 基本Search方法
6.2.2 代碼實戰(zhàn)
?
6.3 Term?
6.3.1 TermQuery?
6.3.2 Hits 返回的命中結(jié)果
6.3.3 關(guān)鍵詞搜索的大致過程
?
6.4 Query?
6.4.1 BooleanQuery布爾搜索
使用場景說明及代碼實戰(zhàn)
6.4.2 ? TermRangeQuery范圍搜索
使用場景說明及代碼實戰(zhàn)
6.4.3 ? NumericRangeQuery范圍搜索
?使用場景說明及代碼實戰(zhàn)
6.4.4 ? PrefixQuery 前綴搜索
使用場景說明及代碼實戰(zhàn)
6.4.5 ? PhraseQuery短語搜索
使用場景說明及代碼實戰(zhàn)
6.4.6 ? MultiPhraseQuery多短語搜索
使用場景說明及代碼實戰(zhàn)
6.4.7 ? FuzzyQuery模糊搜索
使用場景說明及代碼實戰(zhàn)
6.4.8 ? WildcardQuery通配符搜索
使用場景說明及代碼實戰(zhàn)
6.4.9 ? RegexpQuery正則表達式搜索
使用場景說明及代碼實戰(zhàn)
6.4.10 ? 正則表達式語法
深入介紹:正則表達式是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為“元字符”)。模式描述在搜索文本時要匹配的一個或多個字符串。/^\s*$/ 匹配空行。? /\d{2} \d{-5}/ 驗證由兩位數(shù)字、一個連字符再加 5 位數(shù)字組成的 ID 號。
/<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/ 匹配 HTML 標記。
等等詳細語法指導
6.4.11 SpanQuery跨度搜索
使用場景說明及代碼實戰(zhàn)
?
十二、Lucene搜索深入實戰(zhàn)進階
QueryParser語法
一、Terms,F(xiàn)ields
一般來說,創(chuàng)建索引的分析器和查詢的分析器好保持一致(當然也有特殊情況,比如單字索引,分詞組合查詢),所以選擇一個不會干擾查詢詞的分析器是很重要的。
代碼實戰(zhàn)
?
二、Term操作符 ??
AND,OR,分組,特殊字符及: QueryParser.escape(q)? 可去除q中含有查詢關(guān)鍵字的字符!如:* ,? 等
代碼實戰(zhàn)
?
三、模糊查詢,范圍查詢
Lucene支持在Term中使用通配符來支持模糊查詢。
范圍查詢是按字典查詢,非“org.apache.lucene.search.NumericRangeQuery”
代碼實戰(zhàn)
?
四、優(yōu)先級
Lucene支持給不同的查詢詞設(shè)置不同的權(quán)重。設(shè)置權(quán)重使用“^”符號,將“^”放于查詢詞的尾部,同時跟上權(quán)重值,權(quán)重因子越大,該詞越重要。設(shè)置權(quán)重允許你通過給不同的查詢詞設(shè)置不同的權(quán)重來影響文檔的相關(guān)性。
代碼實戰(zhàn)
?
十五、Lucene高級進階
在索引中清除Document
maxDoc()和numDocs()
更新索引中的Document?
分頁搜索的實現(xiàn)
?
十八、 Lucene排序
Lucene默認按照文檔得分進行排序
explain方法
加分
sort排序
?
十九、Lucene過濾
內(nèi)置的過濾器
org.apache.lucene.search.Filter 提供了幾個內(nèi)置的過濾器
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 ? , ? 中 ? , ? 文
代碼實戰(zhàn)
?
20.2 中文分詞器IK Analyzer 2012介紹?
在2012版本中,IK實現(xiàn)了簡單的分詞歧義排除算法,標志著IK分詞器從單純的詞典分詞向模擬語義分詞衍化。?
?
20.3 IK Analyzer 2012特性
采用了特有的“正向迭代細粒度切分算法“,支持細粒度和智能分詞兩種切分模式
2012版本的智能分詞模式支持簡單的分詞排歧義處理和數(shù)量詞合并輸出。?
采用了多子處理器分析模式,支持:英文字母、數(shù)字、中文詞匯等分詞處理,兼容韓文、日文字符?
優(yōu)化的詞典存儲,更小的內(nèi)存占用。支持用戶詞典擴展定義。特別的,在2012版本,詞典支持中文,英文,數(shù)字混合詞語。
?
20.4 IK Analyzer 2012分詞效果示例
IK Analyzer 2012版本支持 細粒度切分 和 智能切分,以下是兩種切分方式的演示樣例。?
代碼實戰(zhàn)
?
20.5 IK Analyzer 2012下載包內(nèi)容
環(huán)境搭建,代碼實戰(zhàn)
自定義擴展詞典實戰(zhàn)
IKAnalyzer.cfg.xml(分詞器擴展配置文件)?
stopword.dic(停止詞典)?
ext.dic(自定義擴展詞典詞典)?
常見UTF-8問題演示及解決,代碼實戰(zhàn)
20.6 高亮工具包
lucene-highlighter-4.3.0.jar
實現(xiàn)類似baidu搜索高亮顯示關(guān)鍵詞,及上下文的功能
代碼實戰(zhàn)
?
二十三、Lucene項目實戰(zhàn) ??9課時
某大型企業(yè)信息化系統(tǒng)中 某某文檔中心管理系統(tǒng)
23.1 實現(xiàn)上傳并解析全文檢索各種文件類型
23.1.1 上傳并解析各種格式的內(nèi)容文檔:(.txt,.pdf,.doc,.xls,.docx,.xlsx,.htm……)
23.1.2 Apache Tika – 文檔解析工具包
org.apache.tika.parser.AutoDetectParser
23.1.3 文件上傳工具包使用實戰(zhàn)
org.apache.commons.fileupload
23.2 實現(xiàn)代碼功能:
23.2.1 文件上傳,
org.apache.commons.fileupload.servlet
實現(xiàn)文件上傳并建立索引
23.2.2 文件下載,
實現(xiàn)文件點擊下載
23.2.3 文件管理:文件刪除,
目錄管理,目錄的增加、修改、刪除
23.2.4 全文檢索:
實現(xiàn)全文檢索分頁,
類似baidu搜索的分頁實現(xiàn)
全文檢索上下文實現(xiàn)摘要
org.apache.Lucene4.search.highlight.*
實現(xiàn)類似baidu搜索高亮顯示關(guān)鍵詞,及上下文的功能