Solr 没有找到子字符串

Solr does not find substring

我有一个 rails 4 应用程序 运行 sunspot solr,在 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>

我有一个名为 "Alpe d'Huez" 的城市,我不想被 solr 找到。 只要您开始输入 Alpe,Solr 只会找到这条记录,但我希望只需输入 "huez" 即可找到它 如何实现?感谢帮助

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

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

马上,您的分析看起来有点可疑。

首先,最典型的情况是您的查询和索引分析器相同或几乎相同(这不是硬性规定,但如果它们不同,您应该知道为什么).如果它们相差太大,查询字词将无法与索引字词很好地匹配,并且您通常会得不到任何结果。

同时使用 EdgeNGramFilterFactory NGramFilterFactory 是很奇怪的。本质上,您将标记拆分为 ngram,然后从您的 ngram 中拆分出 ngram。这并没有让我觉得特别有用,除非你真的打算采用霰弹枪爆炸法进行搜索。

您正在查询时分析中应用词干分析器 (PorterStemFilterFactory),但未在索引时应用。 You're stemmer 应该在这两个时间都被应用它是有用的。

此外,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>