codecamp

Solr处理输入字符:CharFilter

什么是 CharFilter

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

CharFilter可以像 Token Filters 一样链接在一个 Tokenizer 前面。

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

本节将介绍如下几个过滤器:

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

solr.MappingCharFilterFactory

此过滤器创建 org.apache.lucene.analysis.MappingCharFilter,可用于将一个字符串更改为另一个(例如,用于标准化 é 为 e。)。

此过滤器需要指定 mapping 参数,该参数是包含要执行的映射的文件的路径和名称。

例:

<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 注释(正常的注释处理不会总是有效的)。
  • 替换数字字符实体引用,如 A 或  与相应的字符。
  • 终止 ';' 如果输入末尾的实体引用是可选的;否则终止 ';' 是强制性的,以避免 “Alpha&Omega Corp” 之类的错误匹配。
  • 用相应的字符替换所有命名的字符实体引用。
  •   被替换为空格而不是 0xa0 字符。
  • 换行符代替块级元素。
  • <CDATA> 部分被识别。
  • 内嵌标签,如 <b>,<i> 或 <span> 将被删除。
  • 大写字符实体类似 quot、gt、lt 和 amp被认为和小写处理。

Tip:输入不一定是一个 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;

如果 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 执行预标记化 Unicode 标准化。

参数:

name

一个Unicode范式,一nfcnfkcnfkc_cf。默认是nfkc_cf

mode

无论是composedecompose。默认是compose。使用decomposename="nfc"name="nfkc"分别获得NFD或NFKD。

filter

一个 UnicodeSet 模式。集外的代码点始终保持不变。默认是[](空集,没有过滤 - 所有的码点都受到规范化)。

例:

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

solr.PatternReplaceCharFilterFactory

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

参数:

pattern

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

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

改变组的顺序

什么是Solr过滤器
如何运行Solr分析器
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

SolrCloud

SolrCloud配置和参数

如何使用AsciiDoc

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }