斷詞器

斷詞器負責將欄位資料分解為詞彙單元,或稱為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 具有相關 (例如,MappingCharFilterASCIIFoldingFilter) 或幾乎相同 (例如,PatternReplaceCharFilterFactoryPatternReplaceFilterFactory) 的功能,而且不一定總是清楚哪個是最佳選擇。

關於選擇使用哪個,主要取決於您正在使用的斷詞器,以及是否需要預處理字元串流。

例如,假設您有一個斷詞器 (例如 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 的類別路徑(如 安裝外掛程式 一節中所述)。請參閱 solr/modules/analysis-extras/README.md,以取得您需要新增哪些 jar 的相關資訊。

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"

空白詞元分析器

簡單的詞元分析器,會以空白字元分割文字串流,並將非空白字元序列回傳為詞元。請注意,任何標點符號會包含在詞元中。

工廠類別: solr.WhitespaceTokenizerFactory

引數

規則

選用

預設值:java

指定如何定義空白字元以進行詞元分析。有效值如下:

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 詞元篩選器的資訊。