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 link |
| hello |
| hello |
| 如果 a < b,则输出 a; |
| hello |
| a <b A Alpha&ΩΩ |
例:
<analyzer>
<charFilter class="solr.HTMLStripCharFilterFactory"/>
<tokenizer ...>
[...]
</analyzer>
solr.ICUNormalizer2CharFilterFactory
该过滤器使用 ICU4J 执行预标记化 Unicode 标准化。
参数:
- name
一个Unicode范式,一
nfc
,nfkc
,nfkc_cf
。默认是nfkc_cf
。- mode
无论是
compose
或decompose
。默认是compose
。使用decompose
带name="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 |
|
| see-ing look | 从词尾删除 “ing” |
see-ing looking |
|
| see-ing look | 同上,第二个括号可以省略 |
No.1 NO. no. 543 |
|
| #1 NO. #543 | 替换一些字符串文字 |
abc=1234=5678 |
|
| 5678=abc=1234 | 改变组的顺序 |