我正在使用 sunspot_rails gem,到目前为止一切正常,但是:我没有得到任何带有连字符的单词的搜索结果。
例子:
字符串“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 有正确的匹配项。
最佳答案
问题是 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"]
关于ruby-on-rails - Rails sunspot-solr - 带连字符的单词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17225344/