一.概述:
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搜索高亮顯示關鍵詞,及上下文的功能