我正在运行一个rails应用程序太阳黑子solr和一个名为name的列的城市表。有一个名为'Emmendingen'的城市。我得到'Emmendi''Emmendin''Emmendige'的结果,但不是因为这个名字本身是'Emmendingen'。
在模型中我像这样搜索
search(:include => :geo_name_admin_one_code) do
any do
fulltext(q, :fields=> [:name])
fulltext(q, :fields=> [:alternate_name])
end
with(:feature_class, 'P')
order_by(:population,:desc)
limit(10)
end
我的配置看起来像这样
<fieldType name="text" class="solr.TextField" omitNorms="false">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="10"/>
<filter class="solr.ReversedWildcardFilterFactory" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.TrimFilterFactory" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="10"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.TrimFilterFactory" />
</analyzer>
</fieldType>
那么如何才能匹配确切的名称?
答案 0 :(得分:1)
您的标记化索引表单不能超过10个字符。你已经修剪了两次,一次使用NGrams,一次使用EdgeNGrams(看起来非常错误)。
您的查询没有修剪,因此您的11个字符与任何内容都不匹配。
自行解决问题的最简单方法是管理界面中的“分析”屏幕,您可以在其中输入索引和查询字符串,看看会发生什么以及它们是否匹配。
答案 1 :(得分:1)
我用这个配置解决了它
<!-- *** This fieldType is used by Sunspot! *** -->
<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"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>