CharFilters

CharFilter 是一個預先處理輸入字元的元件。

CharFilter 可以像 Token Filter 一樣串聯,並放在斷詞器前面。CharFilter 可以新增、變更或移除字元,同時保留原始字元偏移,以支援醒目顯示等功能。

solr.MappingCharFilterFactory

這個篩選器會建立 org.apache.lucene.analysis.MappingCharFilter,可用於將一個字串變更為另一個字串(例如,將 é 正規化為 e)。

這個篩選器需要指定一個 mapping 引數,該引數是包含要執行之對應的檔案路徑和名稱。

範例

  • 使用名稱

  • 使用類別名稱(舊版)

<analyzer>
  <charFilter name="mapping" mapping="mapping-FoldToASCII.txt"/>
  <tokenizer ...>
  [...]
</analyzer>
<analyzer>
  <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-FoldToASCII.txt"/>
  <tokenizer ...>
  [...]
</analyzer>

對應檔案語法

  • 以井號 (#) 開頭的註解行以及空白行會被忽略。

  • 每個非註解、非空白行都包含以下形式的對應:"來源" => "目標"

    • 雙引號括住的來源字串、選用空格、箭頭 (=>)、選用空格、雙引號括住的目標字串。

  • 對應行不允許尾隨註解。

  • 來源字串必須包含至少一個字元,但目標字串可以為空。

  • 在來源和目標字串中會識別下列字元跳脫序列

    跳脫序列 產生的字元(ECMA-48 別名) Unicode 字元 範例對應行

    \\

    \

    U+005C

    "\\" => "/"

    \"

    "

    U+0022

    "\"and\"" => "'and'"

    \b

    倒退鍵 (BS)

    U+0008

    "\b" => " "

    \t

    Tab 鍵 (HT)

    U+0009

    "\t" => ","

    \n

    換行 (LF)

    U+000A

    "\n" => "<br>"

    \f

    換頁 (FF)

    U+000C

    "\f" => "\n"

    \r

    歸位 (CR)

    U+000D

    "\r" => "/carriage-return/"

    \uXXXX

    4 個十六進位數字參照的 Unicode 字元

    U+XXXX

    "\uFEFF" => ""

    • 反斜線後接任何其他字元會被視為該字元本身,反斜線會被忽略。

solr.HTMLStripCharFilterFactory

此過濾器會建立 org.apache.solr.analysis.HTMLStripCharFilter。此 CharFilter 會從輸入串流中移除 HTML,並將結果傳遞給另一個 CharFilter 或 Tokenizer。

此過濾器

  • 移除 HTML/XML 標籤,同時保留其他內容。

  • 移除標籤內的屬性,並支援可選的屬性引號。

  • 移除 XML 處理指令,例如:<?foo bar?>

  • 移除 XML 註解。

  • 移除以 <!> 開頭的 XML 元素。

  • 移除 <script> 和 <style> 元素的內容。

  • 處理這些元素內的 XML 註解(正常的註解處理並不總是有效)。

  • 將數值字元實體參照(例如 &#65; 或 &#x7f;)替換為對應的字元。

  • 如果實體參照位於輸入的末尾,則結尾的 ';' 是可選的;否則,結尾的 ';' 是強制性的,以避免在類似 "Alpha&Omega Corp" 的字串上產生錯誤比對。

  • 將所有具名的字元實體參照替換為對應的字元。

  • &nbsp; 會被替換為一個空格,而不是 0xa0 字元。

  • 換行符會被替換為區塊級元素。

  • 會識別 <CDATA> 區段。

  • 內嵌標籤,例如 <b><i><span> 將被移除。

  • 會識別並處理大寫字元實體,例如 quotgtltamp,視為小寫。

輸入不一定是 HTML 文件。此過濾器僅移除看起來像 HTML 的結構。如果輸入不包含任何看起來像 HTML 的內容,則此過濾器不會移除任何輸入。

下表提供 HTML 移除的範例。

輸入 輸出

my <a href="www.foo.bar">link</a>

my link

<br>hello<!--comment-->

hello

hello<script><!-- f('<!--internal--></script>'); --></script>

hello

if a<b then print a;

if a<b then print a;

hello <td height=22 nowrap align="left">

hello

a<b &#65 Alpha&Omega Ω

a<b A Alpha&Omega Ω

範例

  • 使用名稱

  • 使用類別名稱(舊版)

<analyzer>
  <charFilter name="htmlStrip"/>
  <tokenizer ...>
  [...]
</analyzer>
<analyzer>
  <charFilter class="solr.HTMLStripCharFilterFactory"/>
  <tokenizer ...>
  [...]
</analyzer>

solr.ICUNormalizer2CharFilterFactory

此過濾器使用 ICU4J 執行預先分詞的 Unicode 正規化。

引數

form

選用

預設值:nfkc_cf

Unicode 正規化形式,為 nfcnfkcnfkc_cf 其中之一。

mode

選用

預設值:compose

composedecompose。預設值為 compose。搭配 name="nfc"name="nfkc" 使用 decompose,分別取得 NFD 或 NFKD。

filter

選用

預設值:[]

UnicodeSet 模式。此集合之外的碼位永遠保持不變。預設值為 [],表示空集合,不進行篩選(所有碼位都會受到正規化)。

範例

  • 使用名稱

  • 使用類別名稱(舊版)

<analyzer>
  <charFilter name="icuNormalizer2"/>
  <tokenizer ...>
  [...]
</analyzer>
<analyzer>
  <charFilter class="solr.ICUNormalizer2CharFilterFactory"/>
  <tokenizer ...>
  [...]
</analyzer>

solr.PatternReplaceCharFilterFactory

此過濾器使用正規表示式來替換或變更字元模式。

引數

pattern

必要

預設值:無

套用到輸入文字的正規表示式模式。

replacement

必要

預設值:無

用來替換符合模式的文字。

您可以在 schema 中像這樣設定此過濾器

  • 使用名稱

  • 使用類別名稱(舊版)

<analyzer>
  <charFilter name="patternReplace"
             pattern="([nN][oO]\.)\s*(\d+)" replacement="$1$2"/>
  <tokenizer ...>
  [...]
</analyzer>
<analyzer>
  <charFilter class="solr.PatternReplaceCharFilterFactory"
             pattern="([nN][oO]\.)\s*(\d+)" replacement="$1$2"/>
  <tokenizer ...>
  [...]
</analyzer>

下表提供以正規表示式為基礎的模式替換範例

輸入 模式 替換 輸出 描述

see-ing looking

(\w+)(ing)

$1

see-ing look

從字尾移除 "ing"。

see-ing looking

(\w+)ing

$1

see-ing look

與上述相同。第二個括號可以省略。

No.1 NO. no. 543

[nN][oO]\.\s*(\d+)

#$1

#1 NO. #543

替換一些字串常值

abc=1234=5678

(\w+)=(\d+)=(\d+)

$3=$1=$2

5678=abc=1234

變更群組的順序。