0

我有一个非常简单的分析器,它试图用空格替换正斜杠 (/)。因为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

令人费解的是,当我调试分析器时,它正确地标记了输入字符串,返回两个标记而不是一个。

到底是怎么回事?

谢谢。

4

1 回答 1

0

一个非常简单的修复。不要在 builder.add 方法的第一个参数中转义前斜杠字符。

builder.add("/", " ");
于 2014-06-17T19:06:04.427 回答