2014-06-17 33 views
0

我有一個非常簡單的分析儀,它試圖用空格替換正斜槓(/)。因爲QueryParser強制我在解析之前使用斜槓轉義字符串,所以我添加了MappingCharFilter到分析器,該分析器用一個空格替換「\ /」。所述分析器被定義如下:Lucene QueryParser分析儀不一致性

@Override 
protected TokenStreamComponents createComponents(String field, Reader in) { 
    NormalizeCharMap.Builder builder = new NormalizeCharMap.Builder(); 
    builder.add("\\/", " "); 
    Reader mappingFilter = new MappingCharFilter(builder.build(), in); 

    Tokenizer tokenizer = new WhitespaceTokenizer(version, mappingFilter); 
    return new TokenStreamComponents(tokenizer); 
} 

然後,我使用此分析器在的QueryParser解析字符串與破折號:

String text = QueryParser.escape("one/two"); 
QueryParser parser = new QueryParser(Version.LUCENE_48, "f", new MyAnalyzer(Version.LUCENE_48)); 
System.err.println(parser.parse(text)); 

預期的輸出將是

f:one f:two 

然而,我得到:

f:one/two 

令人費解的是,當我調試分析器時,它會正確標記輸入字符串,返回兩個令牌而不是一個。

這是怎麼回事?

謝謝。

+0

只是讓你知道,查詢分析器將治療儀之前的文本會,所以衝在F:在最好的情況下,「富巴」:富/棒填充大概在短語查詢,如F結束通過從查詢解析器令牌獲取多個分析器令牌,可以實現這種情況 –

回答

0

一個非常簡單的修復。不要在builder.add方法的第一個參數中轉義前斜槓字符。

builder.add("/", " ");