Solr處理輸入字符:CharFilter

2018-11-14 14:38 更新

什么是 CharFilter

CharFilter 是預(yù)處理輸入字符的組件。

CharFilter可以像 Token Filters 一樣鏈接在一個 Tokenizer 前面。

CharFilters 可以添加、更改或刪除字符,同時保留原始字符偏移以支持突出顯示等功能。

本節(jié)將介紹如下幾個過濾器:

  • solr.MappingCharFilterFactory
  • solr.HTMLStripCharFilterFactory
  • solr.ICUNormalizer2CharFilterFactory
  • solr.PatternReplaceCharFilterFactory

solr.MappingCharFilterFactory

此過濾器創(chuàng)建 org.apache.lucene.analysis.MappingCharFilter,可用于將一個字符串更改為另一個(例如,用于標準化 é 為 e。)。

此過濾器需要指定 mapping 參數(shù),該參數(shù)是包含要執(zhí)行的映射的文件的路徑和名稱。

例:

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

映射文件語法:

  • 以哈希標記(#)開頭的注釋行以及空白行將被忽略。
  • 每個非注釋,非空白行由以下形式的映射組成: "source" => "target",即:雙引號的源字符串、可選的空格、箭頭(=>)、可選的空格、雙引號的目標字符串。
  • 不允許對映射行使用尾隨注釋。
  • 源字符串必須至少包含一個字符,但目標字符串可能為空。
  • 以下字符轉(zhuǎn)義序列在源和目標字符串中被識別:
    轉(zhuǎn)義序列結(jié)果字符(ECMA-48別名)Unicode字符示例映射線

    \\

    \

    U + 005C

    "\\" => "/"

    \"

    "

    U + 0022

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

    \b

    退格(BS)

    U + 0008

    "\b" => " "

    \t

    標簽(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個十六進制數(shù)字引用的 Unicode 字符

    U + XXXX

    "\uFEFF" => ""

    任何其他字符之后的反斜杠被解釋為如果字符不存在反斜線。后面跟著其他字符的反斜杠被解釋為沒有反斜杠的字符。

solr.HTMLStripCharFilterFactory

這個過濾器創(chuàng)建 org.apache.solr.analysis.HTMLStripCharFilter。此 CharFilter 從輸入流中剝離 HTML 并將結(jié)果傳遞給另一個 CharFilter 或 Tokenizer。

這個過濾器:

  • 刪除HTML / XML標記,同時保留其他內(nèi)容。
  • 刪除標簽中的屬性并支持可選的屬性引用。
  • 刪除 XML 處理指令,例如:<?foo bar?>
  • 刪除 XML 注釋。
  • 刪除以 <!> 開頭的 XML 元素。
  • 刪除 <script> 和 <style> 元素的內(nèi)容。
  • 處理這些元素中的 XML 注釋(正常的注釋處理不會總是有效的)。
  • 替換數(shù)字字符實體引用,如 A 或  與相應(yīng)的字符。
  • 終止 ';' 如果輸入末尾的實體引用是可選的;否則終止 ';' 是強制性的,以避免 “Alpha&Omega Corp” 之類的錯誤匹配。
  • 用相應(yīng)的字符替換所有命名的字符實體引用。
  •   被替換為空格而不是 0xa0 字符。
  • 換行符代替塊級元素。
  • <CDATA> 部分被識別。
  • 內(nèi)嵌標簽,如 <b>,<i> 或 <span> 將被刪除。
  • 大寫字符實體類似 quot、gt、lt 和 amp被認為和小寫處理。

Tip:輸入不一定是一個 HTML 文檔。過濾器只刪除看起來像 HTML 的構(gòu)造。如果輸入不包含任何看起來像 HTML 的內(nèi)容,則篩選器不會刪除任何輸入。

下表介紹了 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;

如果 a < b,則輸出 a;

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

hello

a<b A Alpha&Omega Ω

a <b A Alpha&ΩΩ

例:

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

solr.ICUNormalizer2CharFilterFactory

該過濾器使用 ICU4J 執(zhí)行預(yù)標記化 Unicode 標準化。

參數(shù):

name

一個Unicode范式,一nfc,nfkcnfkc_cf。默認是nfkc_cf。

mode

無論是composedecompose。默認是compose。使用decomposename="nfc"name="nfkc"分別獲得NFD或NFKD。

filter

一個 UnicodeSet 模式。集外的代碼點始終保持不變。默認是[](空集,沒有過濾 - 所有的碼點都受到規(guī)范化)。

例:

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

solr.PatternReplaceCharFilterFactory

此過濾器使用正則表達式替換或更改字符模式。

參數(shù):

pattern

正則表達式模式應(yīng)用于傳入的文本。

replacement

用來替換匹配模式的文本。

你可以在 schema.xml 中像這樣配置這個過濾器:

<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

改變組的順序

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號