斷詞器
斷詞器負責將欄位資料分解為詞彙單元,或稱為tokens。
每個 token 通常是文字中字元的子序列。分析器會知道它所設定的欄位,但斷詞器則不會。斷詞器從字元串流(Reader)讀取,並產生一連串 token 物件(TokenStream)。
輸入串流中的空格或其他分隔符號等字元可能會被捨棄。它們也可能會被新增或取代,例如將別名或縮寫對應至標準化的形式。
token 除了其文字值之外,還包含各種中繼資料,例如 token 在欄位中出現的位置。由於斷詞器可能會產生與輸入文字不同的 token,因此您不應假設 token 的文字與欄位中出現的文字相同,或者其長度與原始文字相同。也可能會有多個 token 具有相同的位置或參考原始文字中的相同偏移量。如果您使用 token 中繼資料來執行在欄位文字中醒目提示搜尋結果之類的操作,請記住這一點。
關於斷詞器
您可以使用 <tokenizer>
元素,以 <analyzer>
的子元素方式,在 結構描述中設定文字欄位類型的斷詞器。
-
使用名稱
-
使用類別名稱(舊版)
<fieldType name="text" class="solr.TextField">
<analyzer type="index">
<tokenizer name="standard"/>
<filter name="lowercase"/>
</analyzer>
</fieldType>
<fieldType name="text" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
name/class 屬性會命名一個工廠類別,該類別會在需要時實例化斷詞器物件。斷詞器工廠類別會實作 org.apache.lucene.analysis.TokenizerFactory
。TokenizerFactory 的 create()
方法會接受 Reader 並傳回 TokenStream。當 Solr 建立斷詞器時,它會傳遞一個 Reader 物件,該物件提供文字欄位的內容。
可以透過在 <tokenizer>
元素上設定屬性,將引數傳遞至斷詞器工廠。
-
使用名稱
-
使用類別名稱(舊版)
<fieldType name="semicolonDelimited" class="solr.TextField">
<analyzer type="query">
<tokenizer name="pattern" pattern="; "/>
</analyzer>
</fieldType>
<fieldType name="semicolonDelimited" class="solr.TextField">
<analyzer type="query">
<tokenizer class="solr.PatternTokenizerFactory" pattern="; "/>
</analyzer>
</fieldType>
何時使用 CharFilter 與 TokenFilter
有多對 CharFilter 和 TokenFilter 具有相關 (例如,MappingCharFilter
和 ASCIIFoldingFilter
) 或幾乎相同 (例如,PatternReplaceCharFilterFactory
和 PatternReplaceFilterFactory
) 的功能,而且不一定總是清楚哪個是最佳選擇。
關於選擇使用哪個,主要取決於您正在使用的斷詞器,以及是否需要預處理字元串流。
例如,假設您有一個斷詞器 (例如 StandardTokenizer
),而且您大致上對它的運作方式感到滿意,但您想要自訂某些特定字元的行為。您可以修改規則並使用 JFlex 重新建立自己的斷詞器,但更簡單的方法可能是使用 CharFilter
在斷詞之前簡單地對應某些字元。
以下各節說明此 Solr 版本中包含的斷詞器工廠類別。
標準斷詞器
此斷詞器會將文字欄位分割成 token,將空格和標點符號視為分隔符號。分隔符號字元會被捨棄,但下列情況除外
-
後方沒有空格的句點(點)會保留為 token 的一部分,包括網際網路網域名稱。
-
「@」字元屬於 token 分割標點符號的集合,因此電子郵件地址不會保留為單一 token。
請注意,單字會以連字號分割。
標準斷詞器支援 Unicode 標準附件 UAX#29 單字邊界,具有下列 token 類型:<ALPHANUM>
、<NUM>
、<SOUTHEAST_ASIAN>
、<IDEOGRAPHIC>
和 <HIRAGANA>
。
工廠類別: solr.StandardTokenizerFactory
引數
maxTokenLength
-
選用
預設值:
255
Solr 會忽略超過
maxTokenLength
所指定字元數的 token。
範例
-
使用名稱
-
使用類別名稱(舊版)
<analyzer>
<tokenizer name="standard"/>
</analyzer>
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
</analyzer>
輸入: "Please, email john.doe@foo.com by 03-09, re: m37-xq."
輸出: "Please", "email", "john.doe", "foo.com", "by", "03", "09", "re", "m37", "xq"
Classic Tokenizer
Classic Tokenizer 保留了 Solr 3.1 及先前版本 Standard Tokenizer 的相同行為。它不使用 Standard Tokenizer 使用的 Unicode 標準附件 UAX#29 單字邊界規則。此 tokenizer 將文字欄位分割為 token,將空白和標點符號視為分隔符號。分隔符號會被丟棄,但以下例外:
-
未接續空白的句點(點)會保留為 token 的一部分。
-
單字會在連字符號處分割,除非單字中有數字,在這種情況下,token 不會被分割,數字和連字符號會保留。
-
識別網際網路網域名稱和電子郵件地址,並將它們保留為單一 token。
Factory 類別: solr.ClassicTokenizerFactory
引數
maxTokenLength
-
選用
預設值:
255
Solr 會忽略超過
maxTokenLength
所指定字元數的 token。
範例
-
使用名稱
-
使用類別名稱(舊版)
<analyzer>
<tokenizer name="classic"/>
</analyzer>
<analyzer>
<tokenizer class="solr.ClassicTokenizerFactory"/>
</analyzer>
輸入: "Please, email john.doe@foo.com by 03-09, re: m37-xq."
輸出: "Please", "email", "john.doe@foo.com", "by", "03-09", "re", "m37-xq"
Keyword Tokenizer
此 tokenizer 將整個文字欄位視為單一 token。
Factory 類別: solr.KeywordTokenizerFactory
引數
maxTokenLen
-
選用
預設值:
256
tokenizer 將發出的最大 token 長度。
範例
-
使用名稱
-
使用類別名稱(舊版)
<analyzer>
<tokenizer name="keyword"/>
</analyzer>
<analyzer>
<tokenizer class="solr.KeywordTokenizerFactory"/>
</analyzer>
輸入: "Please, email john.doe@foo.com by 03-09, re: m37-xq."
輸出: "Please, email john.doe@foo.com by 03-09, re: m37-xq."
Letter Tokenizer
此 tokenizer 會從連續字母的字串建立 token,並捨棄所有非字母字元。
Factory 類別: solr.LetterTokenizerFactory
引數
maxTokenLen
-
選用
預設值:
255
tokenizer 將發出的最大 token 長度。
範例
-
使用名稱
-
使用類別名稱(舊版)
<analyzer>
<tokenizer name="letter"/>
</analyzer>
<analyzer>
<tokenizer class="solr.LetterTokenizerFactory"/>
</analyzer>
輸入: "I can’t."
輸出: "I", "can", "t"
Lower Case Tokenizer
通過在非字母處劃分界限來將輸入串流 token 化,然後將所有字母轉換為小寫。空白和非字母會被捨棄。
Factory 類別: solr.LowerCaseTokenizerFactory
引數
maxTokenLen
-
選用
預設值:
255
tokenizer 將發出的最大 token 長度。
範例
-
使用名稱
-
使用類別名稱(舊版)
<analyzer>
<tokenizer name="lowercase"/>
</analyzer>
<analyzer>
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
</analyzer>
輸入: "I just *LOVE* my iPhone!"
輸出: "i", "just", "love", "my", "iphone"
N-Gram Tokenizer
讀取欄位文字並產生指定範圍內大小的 n-gram token。
Factory 類別: solr.NGramTokenizerFactory
引數
minGramSize
-
選用
預設值:
1
最小 n-gram 大小,必須 > 0。
maxGramSize
-
選用
預設值:
2
最大 n-gram 大小,必須 >=
minGramSize
。
範例
預設行為。請注意,此 tokenizer 會對整個欄位進行操作。它不會在空白處中斷欄位。因此,空白字元會包含在編碼中。
-
使用名稱
-
使用類別名稱(舊版)
<analyzer>
<tokenizer name="nGram"/>
</analyzer>
<analyzer>
<tokenizer class="solr.NGramTokenizerFactory"/>
</analyzer>
輸入: "hey man"
輸出: "h", "e", "y", " ", "m", "a", "n", "he", "ey", "y ", " m", "ma", "an"
範例
使用 4 到 5 的 n-gram 大小範圍
-
使用名稱
-
使用類別名稱(舊版)
<analyzer>
<tokenizer name="nGram" minGramSize="4" maxGramSize="5"/>
</analyzer>
<analyzer>
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="4" maxGramSize="5"/>
</analyzer>
輸入: "bicycle"
輸出: "bicy", "bicyc", "icyc", "icycl", "cycl", "cycle", "ycle"
Edge N-Gram Tokenizer
讀取欄位文字並產生指定範圍內大小的邊緣 n-gram token。
Factory 類別: solr.EdgeNGramTokenizerFactory
引數
minGramSize
-
選用
預設值:
1
最小 n-gram 大小,必須 > 0。
maxGramSize
-
選用
預設值:
1
最大 n-gram 大小,必須 >=
minGramSize
。
範例
預設行為(min 和 max 預設為 1)
-
使用名稱
-
使用類別名稱(舊版)
<analyzer>
<tokenizer name="edgeNGram"/>
</analyzer>
<analyzer>
<tokenizer class="solr.EdgeNGramTokenizerFactory"/>
</analyzer>
輸入: "babaloo"
輸出: "b"
範例
邊緣 n-gram 範圍為 2 到 5
-
使用名稱
-
使用類別名稱(舊版)
<analyzer>
<tokenizer name="edgeNGram" minGramSize="2" maxGramSize="5"/>
</analyzer>
<analyzer>
<tokenizer class="solr.EdgeNGramTokenizerFactory" minGramSize="2" maxGramSize="5"/>
</analyzer>
輸入: "babaloo"
輸出:"ba", "bab", "baba", "babal"
ICU Tokenizer
此 tokenizer 會處理多語言文字,並根據其腳本屬性適當地將其 token 化。
您可以透過指定 每個腳本的規則檔來自訂此 tokenizer 的行為。若要新增每個腳本的規則,請新增 rulefiles
引數,其中應包含以逗號分隔的 code:rulefile
配對清單,格式如下:四個字母的 ISO 15924 腳本代碼,後接冒號,然後是資源路徑。例如,若要為拉丁文(腳本代碼 "Latn")和斯拉夫文(腳本代碼 "Cyrl")指定規則,您會輸入 Latn:my.Latin.rules.rbbi,Cyrl:my.Cyrillic.rules.rbbi
。
solr.ICUTokenizerFactory
的預設組態會提供 UAX#29 單字斷詞規則 token 化(例如 solr.StandardTokenizer
),但也包含針對希伯來文(專門處理雙引號和單引號)、針對高棉語、寮語和緬甸語的音節 token 化,以及針對 CJK 字元的基於字典的斷詞的自訂調整。
Factory 類別: solr.ICUTokenizerFactory
引數
rulefile
-
選用
預設值:無
以逗號分隔的
code:rulefile
配對清單,格式如下:四個字母的 ISO 15924 腳本代碼,後接冒號,然後是資源路徑。 cjkAsWords
-
選用
預設值:
true
如果為
true
,則 CJK 文字會進行基於字典的分割,且所有漢字 + 平假名 + 片假名單字都會被標記為 IDEOGRAPHIC。否則,文字會根據 UAX#29 預設值分割。 myanmarAsWords
-
選用
預設值:
true
如果為
true
,則緬甸文字會進行基於字典的分割,否則會將其 token 化為音節。
範例
-
使用名稱
-
使用類別名稱(舊版)
<analyzer>
<!-- no customization -->
<tokenizer name="icu"/>
</analyzer>
<analyzer>
<!-- no customization -->
<tokenizer class="solr.ICUTokenizerFactory"/>
</analyzer>
-
使用名稱
-
使用類別名稱(舊版)
<analyzer>
<tokenizer name="icu"
rulefiles="Latn:my.Latin.rules.rbbi,Cyrl:my.Cyrillic.rules.rbbi"/>
</analyzer>
<analyzer>
<tokenizer class="solr.ICUTokenizerFactory"
rulefiles="Latn:my.Latin.rules.rbbi,Cyrl:my.Cyrillic.rules.rbbi"/>
</analyzer>
若要使用此 tokenizer,您必須將額外的 .jar 新增至 Solr 的類別路徑(如 安裝外掛程式 一節中所述)。請參閱 |
Path Hierarchy Tokenizer
此 tokenizer 會從檔案路徑階層建立同義詞。
Factory 類別: solr.PathHierarchyTokenizerFactory
引數
delimiter
-
必要
預設值:無
您可以指定檔案路徑分隔符號,並將其取代為您提供的分隔符號。這對於使用反斜線分隔符號很有用。
replace
-
必要
預設值:無
指定 Solr 在 token 化輸出中使用的分隔符號字元。
reverse
-
選用
預設值:
false
如果為
true
,則切換 tokenizer 行為以「反向」順序建構路徑階層。這對於 token 化 URL 通常很有用。 skip
-
選用
預設值:
0
從每個發出的 token 中捨棄的最左邊(或最右邊,如果 reverse=true)路徑元素數目。
範例
預設行為
-
使用名稱
-
使用類別名稱(舊版)
<fieldType name="text_path" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer name="pathHierarchy" delimiter="\" replace="/"/>
</analyzer>
</fieldType>
<fieldType name="text_path" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="\" replace="/"/>
</analyzer>
</fieldType>
輸入: "c:\usr\local\apache"
輸出: "c:", "c:/usr", "c:/usr/local", "c:/usr/local/apache"
範例
反向順序
-
使用名稱
-
使用類別名稱(舊版)
<fieldType name="text_path" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer name="pathHierarchy" delimiter="." replace="." reverse="true"/>
</analyzer>
</fieldType>
<fieldType name="text_path" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="." replace="." reverse="true"/>
</analyzer>
</fieldType>
輸入: "www.site.co.uk"
輸出: "www.site.co.uk", "site.co.uk", "co.uk", "uk"
Regular Expression Pattern Tokenizer
此 tokenizer 使用 Java 正則表達式將輸入文字串流分割為 token。由模式引數提供的表達式可以解釋為分隔 token 的分隔符號,或是符合應從文字中擷取為 token 的模式。
如需有關 Java 正則表達式語法的詳細資訊,請參閱 java.util.regex.Pattern
的 Javadocs。
Factory 類別: solr.PatternTokenizerFactory
引數
pattern
-
必要
預設值:無
正則表達式,如
java.util.regex.Pattern
中所定義。 group
-
選用
預設值:
-1
指定要擷取為 token 的正則表達式群組。值 -1 表示正則表達式應視為分隔 token 的分隔符號。非負數群組編號 (>= 0) 表示符合該正則表達式群組的字元序列應轉換為 token。群組零指的是整個正則表達式,大於零的群組指的是正則表達式的括號括住的子表達式,從左到右計數。
範例
以逗號分隔的清單。token 以零個或多個空格、一個逗號和零個或多個空格的序列分隔。
-
使用名稱
-
使用類別名稱(舊版)
<analyzer>
<tokenizer name="pattern" pattern="\s*,\s*"/>
</analyzer>
<analyzer>
<tokenizer class="solr.PatternTokenizerFactory" pattern="\s*,\s*"/>
</analyzer>
輸入: "fee,fie, foe , fum, foo"
輸出: "fee", "fie", "foe", "fum", "foo"
範例
擷取簡單、大寫的單字。擷取至少一個大寫字母後接零個或多個大小寫字母的序列作為 token。
-
使用名稱
-
使用類別名稱(舊版)
<analyzer>
<tokenizer name="pattern" pattern="[A-Z][A-Za-z]*" group="0"/>
</analyzer>
<analyzer>
<tokenizer class="solr.PatternTokenizerFactory" pattern="[A-Z][A-Za-z]*" group="0"/>
</analyzer>
輸入: "Hello. My name is Inigo Montoya. You killed my father. Prepare to die."
輸出: "Hello", "My", "Inigo", "Montoya", "You", "Prepare"
範例
擷取以 "SKU"、"Part" 或 "Part Number" 開頭(區分大小寫)的零件編號,並可選擇使用分號分隔符號。零件編號必須全為數字,並可選擇包含連字符號。正則表達式擷取群組透過從左到右計算左括號來編號。群組 3 是子表達式 "[0-9-]+",它會比對一個或多個數字或連字符號。
-
使用名稱
-
使用類別名稱(舊版)
<analyzer>
<tokenizer name="pattern" pattern="(SKU|Part(\sNumber)?):?\s(\[0-9-\]+)" group="3"/>
</analyzer>
<analyzer>
<tokenizer class="solr.PatternTokenizerFactory" pattern="(SKU|Part(\sNumber)?):?\s(\[0-9-\]+)" group="3"/>
</analyzer>
輸入: "SKU: 1234, Part Number 5678, Part: 126-987"
輸出 "1234", "5678", "126-987"
Simplified Regular Expression Pattern Tokenizer
此 tokenizer 與上述的 PatternTokenizerFactory
類似,但使用 Lucene RegExp
模式比對來為輸入串流建構不同的 token。語法比 PatternTokenizerFactory
更有限制,但 token 化速度快很多。
Factory 類別: solr.SimplePatternTokenizerFactory
引數
pattern
-
必要
預設值:無
正則表達式,如
RegExp
javadocs 中所定義,識別要包含在 token 中的字元。比對是貪婪的,以便在給定點建立最長的比對 token。永遠不會建立空的 token。 determinizeWorkLimit
-
選用
預設值:
10000
從正則表達式計算的確定自動機的總狀態計數限制。
範例
比對以簡單空白字元分隔的 token
-
使用名稱
-
使用類別名稱(舊版)
<analyzer>
<tokenizer name="simplePattern" pattern="[^ \t\r\n]+"/>
</analyzer>
<analyzer>
<tokenizer class="solr.SimplePatternTokenizerFactory" pattern="[^ \t\r\n]+"/>
</analyzer>
Simplified Regular Expression Pattern Splitting Tokenizer
此 tokenizer 與上述的 SimplePatternTokenizerFactory
類似,但使用 Lucene RegExp
模式比對來識別應用於分割 token 的字元序列。語法比 PatternTokenizerFactory
更有限制,但 token 化速度快很多。
Factory 類別: solr.SimplePatternSplitTokenizerFactory
引數
pattern
-
必要
預設值:無
正則表達式,如
RegExp
javadocs 中所定義,識別應分割 token 的字元。比對是貪婪的,以便比對給定點的最長 token 分隔符號。永遠不會建立空的 token。 determinizeWorkLimit
-
選用
預設值:
10000
從正則表達式計算的確定自動機的總狀態計數限制。
範例
比對以簡單空白字元分隔的 token
-
使用名稱
-
使用類別名稱(舊版)
<analyzer>
<tokenizer name="simplePatternSplit" pattern="[ \t\r\n]+"/>
</analyzer>
<analyzer>
<tokenizer class="solr.SimplePatternSplitTokenizerFactory" pattern="[ \t\r\n]+"/>
</analyzer>
UAX29 URL Email Tokenizer
此斷詞器會將文字欄位分割成 token,將空格和標點符號視為分隔符號。分隔符號字元會被捨棄,但下列情況除外
-
未接續空白的句點(點)會保留為 token 的一部分。
-
單字會在連字符號處分割,除非單字中有數字,在這種情況下,token 不會被分割,數字和連字符號會保留。
-
將以下項目辨識並保留為單一 token
-
網際網路網域名稱,其中包含根據 tokenizer 產生時 IANA 根區域資料庫中的白名單驗證的頂級網域
-
電子郵件地址
-
file://
、http(s)://
和ftp://
URL -
IPv4 和 IPv6 位址
-
UAX29 URL Email Tokenizer 支援 Unicode 標準附錄 UAX#29 的斷詞邊界,並具有以下詞元類型:<ALPHANUM>
、<NUM>
、<URL>
、<EMAIL>
、<SOUTHEAST_ASIAN>
、<IDEOGRAPHIC>
和 <HIRAGANA>
。
工廠類別: solr.UAX29URLEmailTokenizerFactory
引數
maxTokenLength
-
選用
預設值:
255
Solr 會忽略超過
maxTokenLength
所指定字元數的 token。
範例
-
使用名稱
-
使用類別名稱(舊版)
<analyzer>
<tokenizer name="uax29URLEmail"/>
</analyzer>
<analyzer>
<tokenizer class="solr.UAX29URLEmailTokenizerFactory"/>
</analyzer>
輸入: "Visit http://accarol.com/contact.htm?from=external&a=10 or e-mail bob.cratchet@accarol.com"
輸出: "Visit", "http://accarol.com/contact.htm?from=external&a=10", "or", "e", "mail", "bob.cratchet@accarol.com"
空白詞元分析器
簡單的詞元分析器,會以空白字元分割文字串流,並將非空白字元序列回傳為詞元。請注意,任何標點符號皆會包含在詞元中。
工廠類別: solr.WhitespaceTokenizerFactory
引數
規則
-
選用
預設值:
java
指定如何定義空白字元以進行詞元分析。有效值如下:
-
java
:使用 Character.isWhitespace(int) -
unicode
:使用 Unicode 的 WHITESPACE 屬性
-
maxTokenLen
-
選用
預設值:
255
tokenizer 將發出的最大 token 長度。
範例
-
使用名稱
-
使用類別名稱(舊版)
<analyzer>
<tokenizer name="whitespace" rule="java" />
</analyzer>
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory" rule="java" />
</analyzer>
輸入: "To be, or what?"
輸出: "To", "be,", "or", "what?"
OpenNLP 詞元分析器和 OpenNLP 篩選器
請參閱 OpenNLP 整合,以瞭解如何使用 OpenNLP 詞元分析器,以及有關可用 OpenNLP 詞元篩選器的資訊。