Java 为什么在Lucene 4,1 analyzer中使用MappingCharFilter会破坏通配符匹配

Java 为什么在Lucene 4,1 analyzer中使用MappingCharFilter会破坏通配符匹配,java,lucene,Java,Lucene,在分析器中使用MappingCharFilter中断通配符匹配 我创建了这个简单的StripSpaceandSeparatorsAnalyzer public class StripSpacesAndSeparatorsAnalyzer extends Analyzer { protected NormalizeCharMap charConvertMap; protected void setCharConvertMap() { NormalizeChar

在分析器中使用MappingCharFilter中断通配符匹配

我创建了这个简单的StripSpaceandSeparatorsAnalyzer

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
不再有效


我做错了什么请让我猜猜:要解析查询,您使用的是常规的
QueryParser
,对吗

尝试使用,它应该会起作用。从javadoc:

覆盖Lucene的默认QueryParser,以便Fuzzy-,Prefix-, 范围-和通配符查询也通过给定的分析器传递, 但通配符(如*)不会从搜索中删除 条件


您正在将同一个分析器传递给吗?是的,我正在传递同一个分析器,好的,我会尝试,但我不明白为什么常规查询解析器在使用我的分析器时只会出错。@PaulTaylor若要了解您的分析器为什么不工作,请尝试在标记这些内容(查询和索引字段)时调试它看看它实际上制造了什么代币。然后尝试添加/删除/修改其中的内容,以便创建所需的标记