我有一个运行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;就可以找到它。 怎么能实现这一目标?谢谢你的帮助
答案 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>