Solr 5搜索含&的H&R无结果,需配置特殊分词器?
问题分析与解决方案
你的问题核心在于WordDelimiterFilterFactory会默认将&这类特殊字符作为分隔符,把H&R拆分成独立的H和R,导致索引中没有完整的"h&r"(经过LowerCaseFilter转小写后)词条,自然搜不到匹配结果。结合你的配置,给出以下解决步骤:
1. 阻止WordDelimiter拆分H&R
方案A:使用保护词(推荐)
在protwords.txt中添加h&r(因为你的配置里有LowerCaseFilterFactory,索引时会转成小写,所以直接加小写即可),这样WordDelimiterFilter会完整保留这个词,不会拆分。
方案B:修改WordDelimiter的字符类型定义
创建wdfftypes.txt文件,添加一行:
& => ALPHA
然后修改WordDelimiterFilterFactory的配置,添加types="wdfftypes.txt"参数,让Solr把&识别为字母的一部分,不再拆分包含&的词语:
<filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" generateWordParts="1" generateNumberParts="0" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0" types="wdfftypes.txt"/>
2. 重新索引数据
分词器配置修改后,必须重新索引所有数据,才能让新的分词规则生效。
3. 正确构造查询
因为你的配置里有LowerCaseFilterFactory,索引中的词条是小写的,所以查询时要使用小写,同时注意转义&:
- 在Solr Admin界面查询:直接输入
q=your_field:"h&r"(用引号做精确匹配),或者q=your_field:h\&r(转义&) - 在URL中查询:需要把&转成URL编码
%26,比如q=your_field:h%26r
额外说明
你之前尝试的H/&R转义方式不对,Solr中对查询里的&只需用\转义(或者URL编码),不需要加/。另外,preserveOriginal="1"参数虽然会保留原始词条,但如果WordDelimiter已经拆分了词语,原始词条会是小写的h&r block,所以必须确保查询时匹配小写的词条。
内容的提问来源于stack exchange,提问作者AravindKumarReddy Sontireddy
相关产品推荐
相关产品推荐

