我正在使用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
答案 0 :(得分:0)
这是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;
}
}
据我所知,目前还没有完美的内置解决方案。