如何在Solr的PatternReplaceCharFilterFactory中实现任意单词数的字符串追加无空格副本
用Solr的PatternReplaceCharFilterFactory实现任意单词数的字符串拼接需求
要实现保留原字符串并追加其无空格副本的效果,无需额外字段或复制字段,可通过两个solr.PatternReplaceCharFilterFactory的组合完成,适配任意数量的单词:
具体配置
在你的schema.xml(或managed-schema)中定义自定义字段类型:
<fieldType name="text_combined" class="solr.TextField"> <analyzer> <!-- 第一步:复制原字符串,生成「原字符串 + 空格 + 原字符串」的格式 --> <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="^(.*)$" replacement="$1 $1"/> <!-- 第二步:移除第二个副本中的所有空格 --> <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(\s)(\w+)(?=(?:\s\w+)*$)" replacement="$2"/> </analyzer> </fieldType>
原理说明
- 第一个CharFilter:用正则
^(.*)$匹配整个输入字符串,通过$1 $1替换为原字符串加空格加原字符串,例如输入abc xyz pqr pyz会变成abc xyz pqr pyz abc xyz pqr pyz。 - 第二个CharFilter:使用正则
(\s)(\w+)(?=(?:\s\w+)*$)定位第二个副本中的空格——正向预查(?=(?:\s\w+)*$)确保匹配的空格属于字符串末尾的单词序列(即第二个副本),然后将「空格+单词」替换为「单词」,最终移除第二个副本的所有空格,得到目标结果abc xyz pqr pyz abcxyzpqrpyz。
验证效果
对输入"abc xyz pqr pyz"执行分析后,最终输出为:
abc xyz pqr pyz abcxyzpqrpyz
该方案支持任意数量的单词(包括1个或多个),无需根据单词数调整正则。
内容的提问来源于stack exchange,提问作者Jigar Gajjar
相关产品推荐
相关产品推荐

