Solr中有哪些Tokenizers

2018-11-15 12:00 更新

Tokenizer 負責將字段數(shù)據(jù)分解為詞法單位或標記。

本節(jié)將介紹以下的 Tokenizer:

  • 標準 Tokenizer
  • 經(jīng)典 Tokenizer
  • 關(guān)鍵字 Tokenizer
  • 信令 Tokenizer
  • 小寫 Tokenizer
  • N-gram Tokenizer
  • 邊緣 N-gram Tokenizer
  • ICU Tokenizer
  • 路徑層次 Tokenizer
  • 正則表達式模式 Tokenizer
  • 簡化的正則表達式模式 Tokenizer
  • 簡化的正則表達式模式分割 Tokenizer
  • UAX29 URL 電子郵件 Tokenizer
  • 白空間 Tokenizer

您可以在 schema.xml 中使用 <tokenizer> 元素(作為 <analyzer> 的子級)將文本字段類型的 tokenizer 配置:

<fieldType name="text" class="solr.TextField">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
  </analyzer>
</fieldType>

類屬性命名一個工廠類,它將在需要時實例化一個 tokenizer 對象。Tokenizer 工廠類實現(xiàn) org.apache.solr.analysis.TokenizerFactory。TokenizerFactory 的create() 方法接受一個 Reader 并返回一個 TokenStream。當 Solr 創(chuàng)建 tokenizer 時,它傳遞一個 Reader 對象來提供文本字段的內(nèi)容。

通過設(shè)置 <tokenizer> 元素的屬性,可以將參數(shù)傳遞給 tokenizer 工廠。

<fieldType name="semicolonDelimited" class="solr.TextField">
  <analyzer type="query">
    <tokenizer class="solr.PatternTokenizerFactory" pattern="; "/>
  </analyzer>
</fieldType>

以下各節(jié)介紹此版本 Solr 中包含的 tokenizer 工廠類。

有關(guān) Solr 的 tokenizers 的用戶提示,請參閱:http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters。

標準 Tokenizer

該 tokenizer 將文本字段分割為標記,將空格和標點符號作為分隔符。分隔符字符被丟棄,但以下情況除外:

  • 不后跟空格的句點 (點) 作為標記的一部分保留,包括因特網(wǎng)域名。
  • “@”字符是標記拆分標點符號集合,因此電子郵件地址不會保留為單個標記。

請注意,單詞是以連字符分隔的。

標準分詞器支持 Unicode 標準附件 UAX#29 字邊界,并且使用下列標記類型:<ALPHANUM>、<NUM>、<SOUTHEAST_ASIAN>、<IDEOGRAPHIC> 和<HIRAGANA>。

工廠類: solr.StandardTokenizerFactory

參數(shù):

maxTokenLength:(整數(shù),默認值為255)Solr 忽略超過由 maxTokenLength 指定的字符數(shù)的標記。

例如:

<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"

經(jīng)典 Tokenizer

經(jīng)典 Tokenizer 保留與 Solr 版本3.1和之前的標準 Tokenizer 相同的行為。它不使用標準 Tokenizer 使用的 Unicode 標準附錄 UAX#29 字邊界規(guī)則。該 tokenizer將文本字段分割為標記,將空格和標點符號作為分隔符。分隔符字符被丟棄,但以下情況除外:

  • 沒有被空白的時間段(點)被保存為令牌的一部分。
  • 除非在單詞中有一個數(shù)字,否則單詞將被拆分為連字符,在這種情況下,令牌不會被拆分,數(shù)字和連字符將被保留。
  • 識別 Internet 域名和電子郵件地址, 并將其保留為單個標記。

工廠類: solr.ClassicTokenizerFactory

參數(shù):

maxTokenLength:(整數(shù),默認值為 255)Solr 忽略超過由 maxTokenLength 指定的字符數(shù)的標記。

例如:

<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"

關(guān)鍵字 Tokenizer

這個 tokenizer 將整個文本字段視為單個標記。

工廠類: solr.KeywordTokenizerFactory

參數(shù):無

示例:

<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."

信令 Tokenizer

該 tokenizer 從連續(xù)字母串創(chuàng)建標記,丟棄所有非字母字符。

工廠類: solr.LetterTokenizerFactory

參數(shù):無

示例:

<analyzer>
  <tokenizer class="solr.LetterTokenizerFactory"/>
</analyzer>

輸入: "I can’t."

輸出:"I", "can", "t"

小寫 Tokenizer

通過以非字母分隔的方式標記輸入流,然后將所有字母轉(zhuǎn)換為小寫??瞻缀头亲帜副粊G棄。

工廠類: solr.LowerCaseTokenizerFactory

參數(shù):無

示例:

<analyzer>
  <tokenizer class="solr.LowerCaseTokenizerFactory"/>
</analyzer>

輸入: "I just *LOVE* my iPhone!"

輸出: "i", "just", "love", "my", "iphone"

N-gram Tokenizer

讀取字段文本并在給定范圍內(nèi)生成大小為 n-gram 的記號。

工廠類: solr.NGramTokenizerFactory

參數(shù):

minGramSize:(整數(shù),默認1)最小 n-gram 大小,必須> 0。

maxGramSize:(整數(shù),默認2)最大 n-gram 大小,必須> = minGramSize。

示例:

默認行為。請注意,這個 tokenizer 操作整個領(lǐng)域。它不會在空格處破壞字段。因此,空格字符被包括在編碼中。

<analyzer>
  <tokenizer class="solr.NGramTokenizerFactory"/>
</analyzer>

輸入:"hey man"

輸出:"h", "e", "y", " ", "m", "a", "n", "he", "ey", "y ", " m", "ma", "an"

示例:

n-gram 大小范圍為4到5:

<analyzer>
  <tokenizer class="solr.NGramTokenizerFactory" minGramSize="4" maxGramSize="5"/>
</analyzer>

輸入:"bicycle"

輸出:"bicy", "bicyc", "icyc", "icycl", "cycl", "cycle", "ycle"

邊緣 N-gram Tokenizer

讀取字段文本并在給定范圍內(nèi)生成大小的邊緣 n-gram 標記。

工廠類: solr.EdgeNGramTokenizerFactory

參數(shù):

minGramSize:(整數(shù),默認值為1)最小 n-gram 大小,必須> 0。

maxGramSize:(整數(shù),默認值為1)最大 n-gram 大小,必須> = minGramSize。

side:("front" 或 "back",默認為"front")是否從文本的開頭 (front) 或從末尾 (back) 計算 n-gram。

示例:

默認行為(最小值和最大值默認為1):

<analyzer>
  <tokenizer class="solr.EdgeNGramTokenizerFactory"/>
</analyzer>

輸入: “babaloo”

輸出: “b”

示例:

邊緣 n-gram 范圍為2到5

<analyzer>
  <tokenizer class="solr.EdgeNGramTokenizerFactory" minGramSize="2" maxGramSize="5"/>
</analyzer>

輸入: “babaloo”

輸出: “ba”,“bab”,“baba”,“babal”

示例:

邊緣 n-gram 范圍從2到5,從背面:

<analyzer>
  <tokenizer class="solr.EdgeNGramTokenizerFactory" minGramSize="2" maxGramSize="5" side="back"/>
</analyzer>

輸入: “babaloo”

輸出: “oo”,“l(fā)oo”,“aloo”,“baloo”

ICU Tokenizer

這個 tokenizer 處理多語言文本,并根據(jù)其腳本屬性對其進行標記。

您可以通過指定每個腳本規(guī)則文件來自定義此標記器的行為。要添加每個腳本規(guī)則,請?zhí)砑右粋€ rulefiles 參數(shù),該參數(shù)應(yīng)包含以下格式的 code:rulefile 對的逗號分隔列表對象:四個字母的 ISO 15924 腳本代碼,后跟一個冒號,然后是一個資源路徑。例如,要指定 Latin(腳本代碼 “Latn”)和 Cyrillic(腳本代碼 “Cyrl”)的規(guī)則,您可以輸入:Latn:my.Latin.rules.rbbi,Cyrl:my.Cyrillic.rules.rbbi。

solr.ICUTokenizerFactory 的默認配置提供了 UAX#29 的分詞規(guī)則標記(如 solr.StandardTokenizer),但也包括自定義定制為 Hebrew(專門處理雙引號和單引號),為 Khmer,Lao 和 Myanmar 的音節(jié)標記,并對CJK字符進行基于字典的分詞。

工廠類: solr.ICUTokenizerFactory

參數(shù):

rulefile:以下格式的 code:rulefile 對的逗號分隔列表對象:四個字母的 ISO 15924 腳本代碼,后跟一個冒號,然后是一個資源路徑。

示例:

<analyzer>
  <!-- no customization -->
  <tokenizer class="solr.ICUTokenizerFactory"/>
</analyzer>
<analyzer>
  <tokenizer class="solr.ICUTokenizerFactory"
             rulefiles="Latn:my.Latin.rules.rbbi,Cyrl:my.Cyrillic.rules.rbbi"/>
</analyzer>

要使用此 tokenizer,您必須將其他 . jar 添加到 Solr 的類路徑中 (如 SolrConfig 中的 Lib 指令中所述)。有關(guān)需要添加到您的 SOLR_HOME/lib 的 jar 的信息,請參見 solr/contrib/analysis-extras/README.txt。

路徑層次 Tokenizer

這個 tokenizer 從文件路徑層次結(jié)構(gòu)中創(chuàng)建同義詞。

工廠類: solr.PathHierarchyTokenizerFactory

參數(shù):

delimiter:(字符,無默認值)您可以指定文件路徑分隔符并將其替換為您提供的分隔符。這對于使用反斜線分隔符是非常有用的。

replace:(字符,無默認值)指定 Solr 在標記化輸出中使用的分隔符。

示例:

<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”

正則表達式模式 Tokenizer

該 tokenizer 使用 Java 正則表達式將輸入文本流分解為標記。由 pattern 參數(shù)提供的表達式可以被解釋為分隔符,或者匹配應(yīng)該從文本中提取的作為記號的模式。

有關(guān) Java 正則表達式語法的更多信息,請參閱 Javadocsjava.util.regex.Pattern。

工廠類: solr.PatternTokenizerFactory

參數(shù):  

pattern:(必需的)正則表達式,如 java.util.regex.Pattern 中所定義。

group:(可選,默認為-1)指定要將哪個正則表達式組提取為標記。值-1意味著正則表達式應(yīng)被視為分隔符的分隔符。非負數(shù)組(> = 0)表示匹配該正則表達式組的字符序列應(yīng)轉(zhuǎn)換為令牌。組0指整個正則表達式,大于零的組引用正則表達式的帶括號的子表達式,從左到右計數(shù)。

示例:

用逗號分隔的列表。令牌由一系列零個或多個空格,一個逗號和零個或多個空格分隔。

<analyzer>
  <tokenizer class="solr.PatternTokenizerFactory" pattern="\s*,\s*"/>
</analyzer>

輸入:"fee,fie, foe , fum, foo"

輸出:"fee", "fie", "foe", "fum", "foo"

示例:

提取簡單的大寫單詞。至少一個大寫字母后跟零個或多個字母的序列被提取為一個標記。

<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” 開頭的零件號碼,區(qū)分大小寫。部件號必須是全部數(shù)字,并帶有可選的連字符。正則表達式捕獲組通過從左到右計算左括號進行編號。組3是子表達式“[0-9 - ] +”,它匹配一個或多個數(shù)字或連字符。

<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"

簡化的正則表達式模式 Tokenizer

這個 tokenizer 類似于上面描述的 PatternTokenizerFactory,但是使用 Lucene RegExp 模式匹配為輸入流構(gòu)造不同的標記。語法比 PatternTokenizerFactory 限制更多,但是標記化速度要快得多。

工廠類: solr.SimplePatternTokenizerFactory

參數(shù):

pattern:(必需)在 RegExpjavadoc 中定義的正則表達式,標識要包含在標記中的字符。這個匹配是貪婪的,這樣就可以創(chuàng)建一個給定點上最長的令牌匹配。空令牌永遠不會被創(chuàng)建。

maxDeterminizedStates:(可選,默認為10000)由 regexp 計算的確定自動機的總狀態(tài)計數(shù)限制。

示例:

匹配由簡單的空格字符分隔的令牌:

<analyzer>
  <tokenizer class="solr.SimplePatternTokenizerFactory" pattern="[^ \t\r\n]+"/>
</analyzer>

簡化的正則表達式模式分割 Tokenizer

這個 tokenizer 類似于上面描述的 SimplePatternTokenizerFactory,但是使用 Lucene RegExp 模式匹配來標識應(yīng)該用于分割標記的字符序列。語法比 PatternTokenizerFactory 限制更多,但是標記化速度要快得多。

工廠類: solr.SimplePatternSplitTokenizerFactory

參數(shù):

pattern:(必需)在 RegExpjavadocs 中定義的正則表達式,標識應(yīng)該分割記號的字符。該匹配是貪婪的,使得在給定點匹配最長的令牌分隔符匹配??樟钆朴肋h不會被創(chuàng)建。

maxDeterminizedStates:(可選,默認為10000)由 regexp 計算的確定自動機的總狀態(tài)計數(shù)限制。

示例:

匹配由簡單的空格字符分隔的令牌:

<analyzer>
  <tokenizer class="solr.SimplePatternSplitTokenizerFactory" pattern="[ \t\r\n]+"/>
</analyzer>

UAX29 URL 電子郵件 Tokenizer

該 tokenizer 將文本字段分割為標記,將空格和標點符號作為分隔符。分隔符字符被丟棄,但以下情況除外:

  • 未后跟空格的句點 (點) 作為標記的一部分保留。
  • 除非在單詞中有一個數(shù)字,否則單詞將被拆分為連字符,在這種情況下,令牌不會被拆分,數(shù)字和連字符將被保留。
  • 識別并保留為單個標記如下:包含頂級域名的互聯(lián)網(wǎng)域名在生成分詞器時根據(jù) IANA 根區(qū)數(shù)據(jù)庫中的白名單進行驗證電子郵件地址:file://、http(s):// 和 ftp:// URLs,IPv4 和 IPv6 地址

該 UAX29 URL 的電子郵件標記生成器支持 Unicode 標準附件 UAX#29 字邊界與以下標記類型:<ALPHANUM>、<NUM>、<URL>、<EMAIL>、<SOUTHEAST_ASIAN>、<IDEOGRAPHIC> 和 <HIRAGANA>。

工廠類: solr.UAX29URLEmailTokenizerFactory

參數(shù):

maxTokenLength:(整數(shù),默認值為255)Solr 忽略超過由 maxTokenLength 指定的字符數(shù)的標記。

示例:

<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"

白空間 Tokenizer

簡單的 tokenizer,將文本流分割成空白字符,并返回非空白字符序列作為標記。請注意,標記中將包含任何標點符號。

工廠類: solr.WhitespaceTokenizerFactory

參數(shù):: rule 指定如何為標記化目的定義空白。有效值如下:

  • java:(默認)使用 Character.isWhitespace(int)
  • unicode:使用 Unicode 的 WHITESPACE 屬性

示例:

<analyzer>
  <tokenizer class="solr.WhitespaceTokenizerFactory" rule="java" />
</analyzer>

輸入:"To be, or what?"

輸出:"To", "be,", "or", "what?"

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號