我正在使用 solr 8.2.0 .我正在尝试在我的 solr 中配置邻近搜索,但它似乎没有删除查询中的停用词。
<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>
我已经提到了非索引字中的停用词.txt目录中的文件,在索引时solr正在删除这些单词,如图所示: 索引术语
我还在那边的分析选项卡中检查了它,停用词被删除了 "分析"选项卡
这是字段:
<field name="pSearchField" type="psearch" indexed="true" stored="true" multiValued="false" />
<copyField source="example" dest="pSearchField"/>
邻近搜索
当我将邻近度设置为 1 或 2 或 3 时,它没有返回任何结果: 结果
这是 Solr 5 及更高版本的已知问题,因为在调用 stopfilter 时它不再重写每个标记的位置。此问题以及有关如何解决该问题的一些建议已在 SOLR-6468 中跟踪。
最简单的解决方案是引入映射字符过滤器工厂,但我对它在字符串内部更改字符持怀疑态度。(即"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;
}
}
据我所知,目前没有完美的内置解决方案来解决这个问题。