Solr找不到搜索字符串
我正在运行一个rails应用程序sunspot solr和一个列名为name的城市表。有一个城市叫“埃门丁根”。我得到了“Emmendi”“Emmendin”“Emmendige”的结果,但没有得到名称本身“Emmendingen”的结果 在模型中,我像这样搜索Solr找不到搜索字符串,solr,sunspot,sunspot-rails,Solr,Sunspot,Sunspot Rails,我正在运行一个rails应用程序sunspot solr和一个列名为name的城市表。有一个城市叫“埃门丁根”。我得到了“Emmendi”“Emmendin”“Emmendige”的结果,但没有得到名称本身“Emmendingen”的结果 在模型中,我像这样搜索 search(:include => :geo_name_admin_one_code) do any do fulltext(q, :fields=> [:name]) fulltext(q, :fie
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>
我的配置看起来像这样
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>
那么如何匹配确切的名称呢?您的标记化索引表单不能超过10个字符。你已经修剪了两次,一次是用NGrams,一次是用EdgeNGrams(看起来非常错误) 您的查询没有修剪,因此您的11字字符与任何内容都不匹配
自行解决此问题的最简单方法是管理UI中的分析屏幕,您可以在其中输入索引和查询字符串,并查看发生了什么以及它们是否匹配。我使用此配置解决了此问题
<!-- *** 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>