我在使用以下字段类型查询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”变成了“Mous”。这就是我们想要的。但是当我们搜索
时鼠标*
似乎没有以同样的方式应用“SnowballPorterFilterFactory”。我想由于最后的*。
我的问题是..有没有办法让“SnowballPorterFilterFactory”知道通配符?这样当我查询
时鼠标*
我没有得到0结果。
有趣的是,如果我查询
备忘录*
记录确实回来了。
或者有人可以提供更好的方法来查询/索引此类型的字段吗?
谢谢戴夫
答案 0 :(得分:2)
上次检查时,使用通配符时,不使用查询分析器。因此,由于您使用的是LowerCaseFilterFactory,因此您的术语将以小写形式编制索引,并且搜索Mous *将不会返回任何内容。
我认为,当您使用通配符时,唯一要做的就是确保使您的查询适应您的术语索引方式(以类似于查询分析器的方式)。
答案 1 :(得分:2)
来自FAQ:
与其他类型的Lucene查询不同,通配符,前缀和模糊查询不会通过分析器传递,分析器是执行诸如词干和小写等操作的组件。跳过分析器的原因是,如果你正在搜索“狗*”,你就不会想要“狗”首先被“狗”,因为那将匹配“狗*”,这不是预期的查询。这些查询无论如何都不区分大小写,因为QueryParser将它们设置为小写。可以使用setLowercaseExpandedTerms(boolean)方法
更改此行为
如果您可以更改Solr来源,SOLR-757附加了一个补丁,您可能会发现它很有用。我不知道如何改变这一点,而不是潜入源头。
什么可能是一个更简单的想法:只有一个没有阻止的复制字段。用户可以搜索这两个字段,然后鼠标*将在非梗塞字段中匹配。
(编辑:实际上,看看那个补丁,我不确定它会做你想要的。但基本上你只需要先改变你的查询处理程序。)