Solr没有找到子串

时间:2015-12-14 20:40:12

标签: solr lucene sunspot

我有一个运行sunspot solr的rails 4应用程序,在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"/>
    <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="10"/>
    <filter class="solr.TrimFilterFactory" />
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.PorterStemFilterFactory"/>
    <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="10"/>
    <filter class="solr.TrimFilterFactory" />
  </analyzer>
</fieldType>

我有一个名为&#34; Alpe d&#39; Huez&#34;这是我无法通过solr找到的。 只要您开始输入Alpe,Solr只会找到此记录,但我希望只需输入&#34; huez&#34;就可以找到它。 怎么能实现这一目标?谢谢你的帮助

2 个答案:

答案 0 :(得分:2)

尝试以下配置,如果搜索字词包含特殊字符,请在双引号内输入搜索字词。

<fieldType name="search" class="solr.TextField" positionIncrementGap="150">
    <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="50"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

答案 1 :(得分:1)

马上关闭,你的分析看起来有点可疑。

首先,您的查询和索引分析器最常见的是相同或几乎相同(这不是一个严格而快速的规则,但如果它们分歧,您应该知道为什么)。如果它们太不相同,则查询字词与索引字词不匹配,并且您通常不会得到任何结果。

同时使用EdgeNGramFilterFactory NGramFilterFactory非常奇怪。基本上,您将令牌分成ngrams,并从ngrams中分割出ngrams。这并没有让我觉得特别有用,除非你真的打算采用霰弹枪方法进行搜索。

您在查询时间分析中应用词干分析器(PorterStemFilterFactory),但不在索引时应用。你应该在两个时候应用你的干扰器才能使它有用。

此外,NGrams和Stemmers并不能很好地融合在一起。如果您需要同时使用它们,则应该将它们编入不同的字段中。

TrimFilterFactory上的小点:它实际上并没有在这里做任何事情。您正在使用StandardTokenizer,因此输入已经在空格上分割。 TrimFilterFactory对关键字分析字段的任何内容都很少有用。

如果您不确定需要如何分析,那么从标准分析开始可能是最有用的:

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer type="index" class="org.apache.lucene.analysis.standard.StandardAnalyzer"/>
  <analyzer type="query" class="org.apache.lucene.analysis.standard.StandardAnalyzer"/>
</fieldType>

从那里开始。

否则,像这样的东西可能最接近你所提供的似乎非常合理的东西:

<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.NGramFilterFactory" minGramSize="1" maxGramSize="10"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="10"/>
  </analyzer>
</fieldType>