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)