詞匯單元流
lucene的分詞過程,是從Reader中獲取原始字符流,產(chǎn)生語匯單元流TokenStream的過程。當(dāng)分析器獲取tokenStream對象以后,它就開始用一個tokenizer對象創(chuàng)建初始語匯單元序列,然后再鏈接任意數(shù)量的tokenFilter對象來修改原始語匯單元。整個分析過程稱為分析器鏈(analyzer chain)。如下圖具有2個tokenFilter的分析器鏈:

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

位置增量部分,make和good之間的位置增量是2,是因為原句子中的"a"被作為停用詞刪除掉了。
參考
Lucene實戰(zhàn)(第2版)