我正在使用sunspot_rails宝石,到目前为止一切都很完美但是:我没有得到任何带连字符的搜索结果。
实施例: 字符串“tron”返回大量结果(所有文章中提到的单词都是e-tron)
字符串“e-tron”返回0结果,即使这是我所有文章中提到的正确单词。
我当前的schema.xml配置:
<fieldType name="text" class="solr.TextField" omitNorms="false">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
我想要的:搜索字符串tron的行为当然没问题,但我也希望搜索字符串e-tron具有正确的匹配。
答案 0 :(得分:8)
问题是solr.StandardTokenizerFactory是用连字符分割单词所以“e-tron”会生成标记“e”,“tron”。大概“e”会丢失,因为solr.TextField过滤器的最小令牌大小为2。
这是一个可以显示您特定问题的示例。
<fieldType name="text" class="solr.TextField" omitNorms="false">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
solr.WhitespaceTokenizerFactory
将在空白处生成令牌。 ["e-tron"]
solr.WordDelimiterFilterFactory
将拆分连字符,但也保留原始单词。 ["e", "tron", "e-tron"]