Несоответствие анализатора Lucene QueryParser

У меня есть очень простой Анализатор, который пытается заменить косую черту (/) пробелами. Поскольку QueryParser заставляет меня экранировать строки косой чертой перед синтаксическим анализом, я добавил в анализатор MappingCharFilter, который заменяет "\/" одним пробелом. Анализатор определяется следующим образом:

@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

Смущает то, что когда я отлаживаю анализатор, он корректно токенизирует входную строку, возвращая два токена вместо одного.

Что здесь происходит?

Спасибо.


person Luís Pureza    schedule 17.06.2014    source источник
comment
просто чтобы вы знали, синтаксический анализатор запросов будет обрабатывать текст раньше, чем анализатор, поэтому ввод f:foo/bar fill, вероятно, приведет к фразовому запросу, подобному f:foo bar в лучшем случае, путем получения нескольких токенов анализатора из токен парсера запросов   -  person omu_negru    schedule 18.06.2014


Ответы (1)


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

builder.add("/", " ");
person Debasis    schedule 17.06.2014