Solr索引:字符过滤器

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

CharFilters可以像Token Filters一样链接起来,并放置在分词器前面。
CharFilters可以添加、更改或移除字符,同时保留原始字符偏移量以支持高亮显示等功能。

solr.MappingCharFilterFactory

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

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

示例:

使用名称:

1
2
3
4
5
<analyzer>
<charFilter name="mapping" mapping="mapping-FoldToASCII.txt"/>
<tokenizer ...>
[...]
</analyzer>

使用类名(遗留):

1
2
3
4
5
<analyzer>
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-FoldToASCII.txt"/>
<tokenizer ...>
[...]
</analyzer>

映射文件语法:

  • 以井号(#)开头的注释行以及空行都被忽略。
  • 每个非注释、非空行由以下形式的映射组成:"source" => "target"
    • 双引号源字符串,可选空白,箭头(=>),可选空白,双引号目标字符串。
  • 映射行上不允许尾随注释。
  • 源字符串必须包含至少一个字符,但目标字符串可以为空。
  • 在源字符串和目标字符串中识别以下字符转义序列:
转义序列 结果字符 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或分词器。

此过滤器:

  • 移除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 Ω

示例:

使用名称:

1
2
3
4
5
<analyzer>
<charFilter name="htmlStrip"/>
<tokenizer ...>
[...]
</analyzer>

使用类名(遗留):

1
2
3
4
5
<analyzer>
<charFilter class="solr.HTMLStripCharFilterFactory"/>
<tokenizer ...>
[...]
</analyzer>

solr.ICUNormalizer2CharFilterFactory

此过滤器使用ICU4J执行预分词Unicode标准化。

参数:

form(可选,默认:nfkc_cf):
一个Unicode标准化形式nfcnfkcnfkc_cf之一。

mode(可选,默认:compose):
composedecompose之一。
默认是compose
使用decomposename="nfc"name="nfkc"分别得到NFD或NFKD。

filter(可选,默认:[]):
一个UnicodeSet模式。
集合外的代码点总是保持不变。
默认是[],作为空集,不过滤(所有代码点都受标准化影响)。

示例:

使用名称:

1
2
3
4
5
<analyzer>
<charFilter name="icuNormalizer2"/>
<tokenizer ...>
[...]
</analyzer>

使用类名(遗留):

1
2
3
4
5
<analyzer>
<charFilter class="solr.ICUNormalizer2CharFilterFactory"/>
<tokenizer ...>
[...]
</analyzer>

solr.PatternReplaceCharFilterFactory

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

参数:

pattern(必需):
要应用于传入文本的正则表达式模式。

replacement(必需):
用于替换匹配模式的文本。

你可以在schema中这样配置此过滤器:

使用名称:

1
2
3
4
5
6
<analyzer>
<charFilter name="patternReplace"
pattern="([nN][oO]\.)\s*(\d+)" replacement="$1$2"/>
<tokenizer ...>
[...]
</analyzer>

使用类名(遗留):

1
2
3
4
5
6
<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 与上面相同。第2个括号可以省略。
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 改变组的顺序。
© 2025 Solr Community of China All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero