2014-06-17 3 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

только так вы знаете, анализатор запросов будет обрабатывать текст перед анализатором будет, поэтому пробивать в е: заливка Foo/бар, вероятно, в конечном итоге в разговорника запросе как F: «Foo бар» в лучшем случае сценария, путем ввода нескольких токенов анализатора из токена анализатора запроса –

ответ

0

Очень простое исправление. Не избегайте символа передней косой черты в первом аргументе метода builder.add.

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