我在使用以下字段类型查询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 *将与非梗概字段匹配。
(编辑:实际上,看着那个补丁,我不确定它会满足您的要求。但是基本上,您只需要先更改查询处理程序即可。)