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>
我有一个 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>