lucene 筆記;

Indexing:

1.  Index.NOT_ANALYZED: 不要分析doc的這個域, 例如:這個域可能是時間,或者關鍵的號碼,不希望 lucene 去解釋它,即將這個 filed 當成完整的一個 token,term, 但是這個域是可以檢索到的,令這個值唯一可以精確控制索引的文檔;

2. Index.ANALYZED_NO_NORMS:   不存儲向量信息

3. Index.NO:  不參與索引;

4. 在 lucene 存儲索引的時候,通常也要存儲 term 出現的次數,位置等,但在有的應用在是不需要的。例如: 篩選, 只要有某個詞語就滿足要求了,此時使用 Field.setOmitTermFreqAndPositions(true) ,可以加快索引和搜索速度,同時減少存儲空間。

5. Store.NO:  不存儲域的值,通常和 Index.ANALYZED 一起使用, 例如:對於網頁, 對內容檢索後,只需要它的 url 即可,需要的時候更具 url 去取即可,還有文件的搜索,保存文件路徑即可。

6. TermVectors.YES: 記錄出現在該文檔中的所有 term, 其信息有出現的位置,次數等, 使用 IndexReader 可以讀出來。這裏的 postion 和 offset 區別如下:

the quick brown   對於 quick:  position = 2, 一個單詞一個單詞遞增, offset爲 4 ~ 9 在原文中的字節位置;



對於被分析的存儲其分析後的 term, 不存儲原始內容。不分析的內容,本身可以看成是一個 term, 這樣看來,都是隻存儲 term 。


Analysis:

text    -> token  -> term

索引最後使用 term, 同樣對於搜索的請求,也轉化爲 term, 這樣就匹配上了~~

使用在2處: indexing  和 searching 

Analyzing:

 " The quick brown fox jumped over the lazy dogs"

"XY&Z Corporation - [email protected]"


$ WhitespaceAnalyzer $:

[The] [quick] [brown] [fox] [jumped] [over] [the] [lazy] [dogs]

[XY&Z] [Corporation] [-] [[email protected]]


$ SimpleAnalyzer $:

[the] [quick] [brown] [fox] [jumped] [over] [the] [lazy] [dogs]

[xy] [z] [corporation] [xyz] [example] [com]


$ StopAnalyzer $:

[quick] [brown] [fox] [jumped] [over] [lazy] [dogs]

[xy] [z] [corporation] [xyz] [example] [com]


$ StandardAnalyzer $:

[quick] [brown] [fox] [jumped] [over] [lazy] [dogs]

[xy&z] [corporation] [[email protected]]


注意上面是分別對原始短語直接使用幾個分析器,而不是先使用一個,在其得到的結果後再使用另外一個分析器。也就是說,StandAnalyzer同時含有小寫,以空格分詞的功能,包含了其他分詞器的某些功能等。


// 在索引的時候使用分析器的流程:

(1) 所有的 document 使用同樣的分析器;

Analyzer analyzer = new StandardAnalyzer();

IndexWriter writer = new IndexWriter(directory, analyzer ...);

writer.addDocument(doc) 

(2)  對於某個文檔使用單獨的分析器,但是在搜索的時候進行 QueryParser 的時候也要使用這個分析器,以便 term 結果一致;

writer.addDocument(doc, analyzer);


// 在搜索的時候使用分析器

QueryParser parser = new QueryParser("content", analyzer);

Query query = parser.parse(expression);

注意: 如果搜索語句中含有 and  or 什麼的,這時由 QueryParser 來分析的, 分析器只分析單個text 片段,解析成 term 形式,這是好理解的。


分析器需要實現的函數:

public  TokenStream tokenStream(String fieldName, Reader reader)













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章