2013-03-25 44 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