Solr找不到搜索字符串

时间:2015-11-11 00:21:51

标签: solr sunspot sunspot-rails

我正在运行一个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>

那么如何才能匹配确切的名称?

2 个答案:

答案 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>