字符过滤器

CharFilter 是一种预处理输入字符的组件。

CharFilter 可以像令牌过滤器一样链接,并放在令牌生成器前面。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>

映射文件语法

  • 以井号 (#) 开头的注释行以及空行将被忽略。

  • 每行非注释、非空行都包含以下形式的映射:"source" => "target"

    • 双引号源字符串、可选空格、箭头 (=>)、可选空格、双引号目标字符串。

  • 映射行上不允许有尾部注释。

  • 源字符串必须至少包含一个字符,但目标字符串可以为空。

  • 源字符串和目标字符串中识别以下字符转义序列

    转义序列 结果字符 (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 个十六进制数字引用的 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 之一。

模式

可选

默认值:compose

composedecompose。默认值为 compose。将 decomposename="nfc"name="nfkc" 结合使用,以分别获取 NFD 或 NFKD。

过滤器

可选

默认值:[]

UnicodeSet 模式。集合之外的代码点始终保持不变。默认值为 [],作为空集合,不进行过滤(所有代码点都受规范化约束)。

示例

带名称

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

带类名(旧版)

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

solr.PatternReplaceCharFilterFactory

此过滤器使用正则表达式替换或更改字符模式。

参数

模式

必需

默认值:无

应用于传入文本的正则表达式模式。

替换

必需

默认值:无

用于替换匹配模式的文本。

可以在模式中配置此过滤器,如下所示

带名称

<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

更改组的顺序。