SnowballPorterFilterFactory

SnowballPorterFilterFactory

我在使用以下字段类型查询Solr时遇到问题:

<fieldType name="text_ci" class="solr.TextField" positionIncrementGap="100">
   <analyzer>
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/>
       <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
   </analyzer>
</fieldType>

如您所见,在建立索引和查询时,它将应用“SnowballPorterFilterFactory”。如果我索引类似

鼠标的乐趣

它的索引为:

如您所见,“SnowballPorterFilterFactory”将“Mouse”一词变成了“Mous”。这就是我们想要的。但是,当我们搜索

老鼠*

似乎没有以相同的方式应用“SnowballPorterFilterFactory”。我猜是由于*结尾。

我的问题是..有没有办法让“SnowballPorterFilterFactory”知道通配符?这样当我查询

老鼠*

我没有得到0个结果。

有趣的是,如果我查询

慕斯*

记录确实回来了。

或者有人可以提供更好的方法来查询/索引这种类型的字段?

谢谢戴夫

最佳答案

FAQ:

与其他类型的Lucene查询不同,通配符,前缀和模糊查询不会通过分析器传递,该分析器是执行词干和小写的操作的组件。跳过分析器的原因是,如果您要搜索“dogs *”,则不希望“dogs”首先词干为“dog”,因为那样会匹配“dog *”,这不是预期的查询。这些查询无论如何都不区分大小写,因为QueryParser使它们变为小写。可以使用setLowercaseExpandedTerms(boolean)方法更改此行为

如果您可以更改Solr来源,则SOLR-757附带有一个补丁,您可能会觉得有用。除了深入了解源代码外,我不知道有什么方法可以更改此内容。

可能是一个更简单的主意:只保留一个未阻止的复制字段。用户可以搜索这两个字段,然后mouse *将与非梗概字段匹配。

(编辑:实际上,看着那个补丁,我不确定它会满足您的要求。但是基本上,您只需要先更改查询处理程序即可。)

08-16 02:23