У меня есть очень простой Анализатор, который пытается заменить косую черту (/) пробелами. Поскольку 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
Смущает то, что когда я отлаживаю анализатор, он корректно токенизирует входную строку, возвращая два токена вместо одного.
Что здесь происходит?
Спасибо.