我正在使用solr 8.2.0。我正在尝试在Solr中配置邻近搜索,但它似乎并未删除query中的停用词。
<fieldType name="psearch" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.ClassicTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.ClassicTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
</analyzer>
</fieldType>
我已经在目录中的stopwords.txt文件中提到了停用词,在索引时间solr删除了这些词,如图所示:indexed terms
我还在分析标签中检查了该关键词,并删除了停用词Analysis tab
这是字段:
<field name="pSearchField" type="psearch" indexed="true" stored="true" multiValued="false" />
<copyField source="example" dest="pSearchField"/>
并且当我将接近度设置为1或2或3时,它不会返回任何结果:result
这是Solr 5及更高版本的一个已知问题,因为在调用stopfilter时,它不再为每个标记重写位置。在SOLR-6468中跟踪了此问题,并提出了一些解决方法。
最简单的解决方法是to introduce a mapping char filter factory,但我对在字符串内部更改字符表示怀疑。 (即"to" => ""
也影响veto
,而不仅仅是to
)。可以用多个PatternReplaceCharFilterFactories代替。
票证线程中显示的另一个选项是使用自定义过滤器重写每个令牌的位置数据:
package filters; import java.io.IOException; import java.util.Map; import org.apache.lucene.analysis.TokenFilter; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute; import org.apache.lucene.analysis.util.TokenFilterFactory; public class RemoveTokenGapsFilterFactory extends TokenFilterFactory { public RemoveTokenGapsFilterFactory(Map<String, String> args) { super(args); } @Override public TokenStream create(TokenStream input) { RemoveTokenGapsFilter filter = new RemoveTokenGapsFilter(input); return filter; } } final class RemoveTokenGapsFilter extends TokenFilter { private final PositionIncrementAttribute posIncrAtt = addAttribute(PositionIncrementAttribute.class); public RemoveTokenGapsFilter(TokenStream input) { super(input); } @Override public final boolean incrementToken() throws IOException { while (input.incrementToken()) { posIncrAtt.setPositionIncrement(1); return true; } return false; } }
据我所知,目前还没有完美的内置解决方案。