[英]Solr stop words not seem to work , stop words are removed while indexing but still it at query time the stopwords are not removed in proximity search
我正在使用 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>
我已經提到了目錄中 stopwords.txt 文件中的停用詞,在索引時間 solr 正在刪除您在圖片中看到的單詞: indexed terms
我還在分析選項卡中檢查了它,停用詞正在被刪除分析選項卡
這里是領域:
<field name="pSearchField" type="psearch" indexed="true" stored="true" multiValued="false" />
<copyField source="example" dest="pSearchField"/>
當我將接近度設置為 1 或 2 或 3 時,它不返回任何結果:結果
這是 Solr 5 及更高版本的一個已知問題,因為當調用停止過濾器時,它不再為每個令牌重寫 position。 SOLR-6468中跟蹤了這個問題,並提供了一些解決方法的建議。
最簡單的解決方案是引入一個映射字符過濾器工廠,但我對它在字符串內部更改字符持懷疑態度。 (即"to" => ""
也影響veto
而不僅僅是to
)。 這可以用多個PatternReplaceCharFilterFactories來處理。
票證線程中顯示的另一個選項是使用自定義過濾器,該過濾器為每個令牌重寫 position 數據:
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;
}
}
據我所知,目前還沒有完美的內置解決方案來解決這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.