什么是Tokenizer

2018-11-14 13:55 更新

Tokenizer 的工作是將文本流分解為令牌,其中每個(gè)令牌(通常)是文本中字符的子序列。分析器知道它配置的字段,但 tokenizer 不是。Tokenizers 從字符流(Reader)中讀取并生成一系列令牌對(duì)象(TokenStream)。

輸入流中的字符可能被丟棄,如空格或其他分隔符。也可以添加或替換它們,例如將別名或縮寫映射到規(guī)范化的窗體。令牌包含除文本值之外的各種元數(shù)據(jù),例如字段中令牌出現(xiàn)的位置。由于 Tokenizer 可能會(huì)產(chǎn)生與輸入文本不一致的標(biāo)記,因此不應(yīng)假定該標(biāo)記的文本與字段中出現(xiàn)的文本相同,或者其長度與原始文本相同。也可能有多個(gè)令牌具有相同的位置或引用原始文本中的相同偏移量。請(qǐng)記住,如果您使用令牌元數(shù)據(jù)來突出顯示字段文本中的搜索結(jié)果。

<fieldType name="text" class="solr.TextField">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
  </analyzer>
</fieldType>

在 tokenizer 元素中命名的類不是實(shí)際的 tokenizer,而是實(shí)現(xiàn) TokenizerFactory API 的類。這個(gè)工廠類將被調(diào)用來根據(jù)需要?jiǎng)?chuàng)建新的 tokenizer 實(shí)例。由工廠創(chuàng)建的對(duì)象必須來自于 Tokenizer,這表示它們產(chǎn)生令牌序列。如果令牌生成器產(chǎn)生可以按原樣使用的令牌,則它可能是分析器的唯一組件。否則,tokenizer 的輸出標(biāo)記將作為流水線中第一個(gè)過濾器階段的輸入。

TypeTokenFilterFactory 可用與創(chuàng)建 TypeTokenFilter 根據(jù)在 factory.getStopTypes 中設(shè)置的 TypeAttribute。

有關(guān)可用 TokenFilters 的完整列表,請(qǐng)參閱 Tokenizers 部分。

何時(shí)使用 CharFilter 與 TokenFilter

有幾個(gè) CharFilter 和 TokenFilter 對(duì)具有相關(guān)的(即:MappingCharFilter 和 ASCIIFoldingFilter)或幾乎相同的(即:PatternReplaceCharFilterFactory 和PatternReplaceFilterFactory)功能,并且它可能并不總是顯而易見的,這是最好的選擇。

決定使用哪一個(gè) Tokenizer,以及是否需要預(yù)處理字符流。

例如,假設(shè)你有一個(gè) tokenizer,如 StandardTokenizer,雖然你對(duì)它的工作方式感到滿意,但是你想要定制一些特定字符的行為。您可以修改規(guī)則并使用 JFlex 重新構(gòu)建自己的 tokenizer,但是在使用標(biāo)記和 CharFilter 之前簡單地映射某些字符可能更容易。

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)