从Solr 3迁移至Solr 9的标点符号相关问题求助
Solr 3→9迁移问题解决方案
问题1:带标点的短语搜索无结果
原因是Solr 9默认分词器(如StandardTokenizer)会将标点符号作为词分隔符,导致索引时短语中的标点被剥离,而搜索时带标点的短语会被拆分成包含标点的词,与索引中的词无法匹配。
解决方法是确保索引和查询阶段的分词逻辑一致,通过修改字段类型的分析器实现:
若需保留标点并精确匹配:
定义字段类型时使用WhitespaceTokenizerFactory(仅按空格分词,保留标点),配合必要过滤器:<fieldType name="text_phrase" class="solr.TextField"> <analyzer type="index"> <tokenizer class="solr.WhitespaceTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.WhitespaceTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>将需要短语搜索的字段指定为该类型,例如:
<field name="content" type="text_phrase" indexed="true" stored="true"/>若需忽略标点进行匹配:
添加PatternReplaceCharFilterFactory在索引和查询阶段统一移除标点:<fieldType name="text_phrase" class="solr.TextField"> <analyzer type="index"> <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[^a-zA-Z0-9\s]" replacement=""/> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query"> <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[^a-zA-Z0-9\s]" replacement=""/> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>这样无论索引还是查询,标点都会被移除,带标点的短语搜索可匹配对应内容。
问题2:智能撇号与普通撇号不等效
原因是Solr默认将智能撇号(’)和普通撇号(')视为不同字符,索引和查询时未做统一映射。
解决方法是在字段类型的分析器中添加MappingCharFilterFactory,将智能撇号映射为普通撇号:
<fieldType name="text_general" class="solr.TextField"> <analyzer type="index"> <charFilter class="solr.MappingCharFilterFactory" mapping="mapping.txt"/> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> <!-- 其他所需过滤器 --> </analyzer> <analyzer type="query"> <charFilter class="solr.MappingCharFilterFactory" mapping="mapping.txt"/> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> <!-- 其他所需过滤器 --> </analyzer> </fieldType>
在Solr的conf目录下创建mapping.txt文件,添加映射规则:
’ => '
这样索引和查询时智能撇号都会被替换成普通撇号,两种写法的搜索结果将一致。
注意:修改配置后需重新索引所有数据,旧索引内容不会自动生效。
内容的提问来源于stack exchange,提问作者J Zhu
相关产品推荐
相关产品推荐

