2013-03-25 46 views
2

在分析仪使用MappingCharFilter打破通配符匹配在Lucene的4,1分析仪打破通配符为什么使用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* 

out的initReader()方法然后

catno:WRATHCD-25* 

现在的作品,但当然

catno:WRATHCD25 

不再起作用的。

威猛我做错了,请

+0

您是否将相同的分析器传递到['QueryParser' ctor](http://lucene.apache.org/core/4_1_0/queryparser/org/apache/lucene/queryparser/classic/QueryParser.html #QueryParser(org.apache.lucene.util.Version,%20java.lang.String,%20org.apache.lucene.analysis.Analyzer))? – femtoRgon 2013-03-25 16:53:08

+0

是的,我通过了相同的分析器 – 2013-03-25 19:59:53

回答

1

让我猜:分析查询,您要使用正规QueryParser,对不对?

尝试使用AnalyzingQueryParser,它应该做的伎俩。根据JavaDoc:

覆盖Lucene的默认的QueryParser使Fuzzy-,Prefix-, 范围 - 和WildcardQuerys也通过给定的分析仪, 但通配符传递(如*)没有得到删除从搜索 的条款。

+0

是的我很好,我会尝试,但我不明白为什么常规查询分析器只使用我的分析仪时出现问题。 – 2013-03-30 07:22:52

+0

@PaulTaylor看看为什么你的分析器不工作,试着在tokenizez的东西(包括查询和索引字段)上进行调试,看看它实际产生什么标记。然后尝试添加/删除/修改其中的东西,以便它创建您想要的令牌 – 2013-04-03 11:31:00