簡體   English   中英

Solr 停用詞似乎不起作用,在索引時刪除了停用詞,但在查詢時仍然沒有在鄰近搜索中刪除停用詞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM