Lucene里經常被聊到的幾個話題
lvpei.cnblogs.com.自己總結的Lucene熟悉而曖昧的幾個問題。
1、索引及搜索的概念
將原始數據處理成一個高效的交差引用的查找結構以便于快速的搜索。索引結構是指快速隨機訪問存于其內部的關鍵詞的數據結構。
搜索是在一個索引中查找單詞來找出它們所出現的文檔的過程。支持單個和多個詞匯的查詢,短語查詢,通配符,結果分級和排序。
2、lucene的核心類
核心索引類
IndexWriter唯一能寫索引的類 索引的寫入和索引的整體的維護 合并,優化
Analyzer:分析文本內容,提取關鍵字
Document:一個Document代表字段的集合
Field:每個Document含有一個或多個字段,具體化為Field類。是否存儲,是否索引,是否分詞
核心搜索類
IndexSearcher以只讀方式打開索引,提供幾個搜索方法,最簡單的接受單個Query對象做為參數并返回一個Hits 對象。
Term是搜索的基本單元。與Field對象類似,它由一對字符串元素組成:字段的名稱和字段的值。
Query q = new TermQuery(new Term(“contents”, “lucene”));
Hits hits = is.search(q);
Query的幾個子類實現就是lucene的幾種搜索方式:TermQuery、BooleanQuery,模糊查詢PhraseQuery,前綴查詢PrefixQuery, PhrasePrefixQuery, 范圍搜索RangeQuery
通配符搜索WildcardQuery
Hits類是一個搜索結果(匹配給定查詢的文檔)文檔隊列指針的簡單容器。并不從索引中加載所有匹配文檔。
3、提高索引效率。
可以合并索引來減少目錄索引文件的數量,以提高處理索引的效率。
IndexWriter的optimize()對索引目錄和緩存目錄下所有的segment優化,Lucene只需要打開一個索引文件加載,效率會大大提高。
優化也會帶來一些損失:耗費更多的內存和磁盤空間
MERGE_FACTOR用于子索引(Segment)合并,相當于ORAl數據庫中對大批量的數據插入操作優化,值越大,索引效率越快。
RAMDirectory把一個普通的index完全讀取到內存中,比真正的文件系統快很多.
盡可能對字段進行索引來提高查詢速度.
4、lucene2.1到2.4的變動
IndexWriter 的構造器 參數多了一個字段長度,(目錄,分析器,重建索引)
IndexWriter.flush()更改為commit();
Hits 命中類 3.0中會被刪除。
5、分詞方法
字符串匹配的分詞方法(正向最大 反向匹配 最小切分 雙向匹配)
詞義分析(不成熟 LingPipe自然語言處理的Java開源工具包 主題概念分類)、統計分詞(分詞詞典)。
6、lucene索引訪問原則
同一時刻,lucene索引中允許有一個進程對其進行加入文檔,刪除文檔,更新索引等操作。
同一時刻,lucene索引允許多個線程同時對其進行檢索。
7、Lucene鎖機制
使用commit.lock與write.lock實現鎖機制。所謂的鎖其實是存放于系統臨時目錄內的一個文件。
建立索引 write.lock / 合并索引 commit.lock segment合并和讀取
8、lucene索引文件格式
segment:一個索引中,會包含有多個segment。每個segment都有一個統一的前綴,前綴是當前索引的document數量
segments:一個完整的索引中,有且只有一個“segments”文件,記錄了當前索引中所有segment的信息。
.cfs格式:復合索引格式,IndexWriter的屬性:useCompoundFile,索引的內容可能非常大,文件數量可能非常的多
.tii和.tis格式:存儲分詞后的詞條,tii是所有文件,標明了每個.tis文件中詞條的位置
fnm格式:fnm格式的文件包含了Document中的所有Field名稱。
.fdx和.fdt格式:域值存儲表,.fdt存儲具有Store.YES屬性的Field數據
deletable格式:文檔被刪除后并不是立刻從索引中去除
nrm:標準化因子文件,索引階段設置Document Boost和Field Boost,對文檔評分權重
9、影響Lucene對文檔評分權重的四種方式
在索引階段設置Document Boost和Field Boost,存儲在(.nrm)文件中。
在搜索語句中,設置Query Boost.
繼承并實現自己的Similarity,實現其中的接口可以干預打分的過程
繼承并實現自己的collector 。將docid和score插入一個PriorityQueue中,使得得分最高的文檔先返回。
10、lucene增量索引的關鍵
1、數據庫必須對數據是否已經索引做好標識
2、IndexWriter中有一個參數boolean類型的,用來確定是重建索引(true)還是增量索引。

浙公網安備 33010602011771號