为什么在Lucene 4,1分析器中使用MappingCharFilter打破通配符匹配

时间:2013-03-25 13:22:38

标签: java lucene

在分析器中使用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

不再有效。

Wham我做错了

1 个答案:

答案 0 :(得分:1)

我猜:要解析查询,您使用的是常规QueryParser,对吗?

尝试使用AnalyzingQueryParser,它应该可以解决问题。来自javadoc:

  

覆盖Lucene的默认QueryParser,以便模糊,前缀 - ,   Range-和WildcardQuerys也通过给定的分析器传递,   但不会从搜索中删除外卡字符(如*)   术语

相关问题