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:

覆盖 Lucene 的默认 QueryParser,以便模糊查询、前缀查询、范围查询和通配符查询也通过给定的分析器,但通配符(如 *)不会从搜索词中删除。

于 2013-03-29T22:12:29.473 回答