Solr的SnowballPorterFilterFactory和Wildcard参数

时间:2010-07-23 09:51:19

标签: indexing solr wildcard filterfactory

我在使用以下字段类型查询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”。如果我索引类似

  

鼠标的东西和乐趣

它的索引为:

Index Breakdown in Solr

正如您所看到的,“鼠标”这个词被“SnowballPorterFilterFactory”变成了“Mous”。这就是我们想要的。但是当我们搜索

  

鼠标*

似乎没有以同样的方式应用“SnowballPorterFilterFactory”。我想由于最后的*。

Query Breakdown in Solr

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

  

鼠标*

我没有得到0结果。

有趣的是,如果我查询

  

备忘录*

记录确实回来了。

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

谢谢戴夫

2 个答案:

答案 0 :(得分:2)

上次检查时,使用通配符时,不使用查询分析器。因此,由于您使用的是LowerCaseFilterFactory,因此您的术语将以小写形式编制索引,并且搜索Mous *将不会返回任何内容。

我认为,当您使用通配符时,唯一要做的就是确保使您的查询适应您的术语索引方式(以类似于查询分析器的方式)。

答案 1 :(得分:2)

来自FAQ

  

与其他类型的Lucene查询不同,通配符,前缀和模糊查询不会通过分析器传递,分析器是执行诸如词干和小写等操作的组件。跳过分析器的原因是,如果你正在搜索“狗*”,你就不会想要“狗”首先被“狗”,因为那将匹配“狗*”,这不是预期的查询。这些查询无论如何都不区分大小写,因为QueryParser将它们设置为小写。可以使用setLowercaseExpandedTerms(boolean)方法

更改此行为

如果您可以更改Solr来源,SOLR-757附加了一个补丁,您可能会发现它很有用。我不知道如何改变这一点,而不是潜入源头。

什么可能是一个更简单的想法:只有一个没有阻止的复制字段。用户可以搜索这两个字段,然后鼠标*将在非梗塞字段中匹配。

(编辑:实际上,看看那个补丁,我不确定它会做你想要的。但基本上你只需要先改变你的查询处理程序。)