詞匯單元流
lucene的分詞過程,是從Reader中獲取原始字符流,產生語匯單元流TokenStream的過程。當分析器獲取tokenStream對象以后,它就開始用一個tokenizer對象創建初始語匯單元序列,然后再鏈接任意數量的tokenFilter對象來修改原始語匯單元。整個分析過程稱為分析器鏈(analyzer chain)。如下圖具有2個tokenFilter的分析器鏈:
TokenStream
分詞后產生語匯單元流,流中存儲了分詞的各種信息,可通過TokenStream有效獲取分詞單元。
Tokenizer
負責接收Reader對象的字符,創建原始語匯單元——分詞。
TokenFilter
負責處理輸入的語匯單元,通過新增、刪除或修改屬性的方式產生新的語匯單元。
詞匯單元基本術語
語匯單元
分詞過程中產生的基本單元,攜帶文本值(單詞本身)和一些元數據:文本值偏移量、位置增量、詞匯單元類型。語匯單元可以選擇性包含一些由程序定義的標志位和任意字節數的有效負載,這樣程序就能根據具體需要來處理這些詞匯單元。
偏移量
偏移量包括起點偏移量和終點偏移量;起點偏移量指詞匯單元文本起始字符在原始文本中的位置,終點偏移量指詞匯單元文本終止字符的下一個位置。
位置增量
位置增量將當前詞匯單元和前一個詞匯單元在位置上關聯起來。位置增量會影響短語查詢和跨度查詢,這些查詢都需要用到位置信息。
- posIncr = 1, 表示當前詞匯單元和前一詞匯單元連續,如果所有詞匯單元的posIncr都是1,則流中各個文本值存在于唯一確定且連續的位置上。
- posIncr > 1, 表示當前詞匯單元和前一詞匯單元之間有空隙,可能是移除停用詞后產生
- posIncr = 0, 表示當前詞匯單元和前一詞匯單元處在相同的位置上。詞匯單元在同一位置可用于表示某種關系,例如同義詞關系。
詞匯單元類型
用String對象表示詞匯單元類型,默認值是“word”,如果需要可以在詞匯單元過濾過程中控制和利用類型屬性。
有效負載
每個詞匯單元可以有多個選擇標志;lucene內置分詞器不會使用這些標志,但你自己設計的程序可以使用它們。此外,每個詞匯單元都能以byte[]數組形式記錄在索引中,用以指向有效負載。
下面是使用StandardAnalyzer分詞的一個具體例子,原始文本內容為text:
text = "Bad times make a good man"
分詞結果如下圖:
位置增量部分,make和good之間的位置增量是2,是因為原句子中的"a"被作為停用詞刪除掉了。
參考
Lucene實戰(第2版)