2

アナライザーで MappingCharFilter を使用してワイルドカードの一致を壊す

この単純な StripSpacesAndSeparatorsAnalyzer を作成しました

public class StripSpacesAndSeparatorsAnalyzer extends Analyzer {

    protected NormalizeCharMap charConvertMap;

    protected void setCharConvertMap() {

        NormalizeCharMap.Builder builder = new NormalizeCharMap.Builder();
        builder.add(" ","");
        builder.add("-","");
        builder.add("_","");
        builder.add(":","");
        charConvertMap = builder.build();
    }

    public StripSpacesAndSeparatorsAnalyzer() {
        setCharConvertMap();
    }

    @Override
    protected TokenStreamComponents createComponents(String fieldName, 
                                                     Reader reader) {
        Tokenizer source = new KeywordTokenizer(reader);
        TokenStream filter = new LowercaseFilter(source);
        return new TokenStreamComponents(source, filter);
    }


    @Override
    protected Reader initReader(String fieldName,
                                Reader reader)
    {
        return new MappingCharFilter(charConvertMap, reader);
    }
} 

フィールド内のハイフンなどの特定の文字を無視して、検索できるようにします

catno:WRATHCD25
catno:WRATHCD-25

同じ結果が得られ、それは機能します (インデックスに追加されたフィールドの元の値は WRATHCD-25 でした)

ただし、ワイルドカード検索には問題があります

catno:WRATHCD25*

動作しますが、

catno:WRATHCD-25*

ではない

アナライザーを修正して initReader() メソッドをコメントアウトすると、

catno:WRATHCD-25*

今は動作しますが、もちろん

catno:WRATHCD25

動作しなくなりました。

私が間違っていることをしてください

4

1 に答える 1

1

推測してみましょう: クエリを解析するには、通常QueryParserのを使用していますよね?

を使用してみてくださいAnalyzingQueryParser。うまくいくはずです。javadoc から:

Fuzzy、Prefix、Range、および WildcardQuery も指定されたアナライザーを通過するように、Lucene のデフォルト QueryParser をオーバーライドしますが、ワイルドカード文字 (* など) は検索語から削除されません。

于 2013-03-29T22:12:29.473 に答える