CharFilters

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

CharFilters 可以像 Token Filters 一样链接,并放置在 Tokenizer 前面。 CharFilters 可以添加、更改或删除字符,同时保留原始字符偏移量以支持诸如突出显示之类的功能。

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 之一。

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

更改组的顺序。