我有一个非常简单的 Analyzer ,它试图用空格替换正斜杠(/)。因为 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
令人费解的是,当我调试分析器时,它会正确地标记输入字符串,返回两个令牌而不是一个。
发生了什么事?
感谢。
答案 0 :(得分:0)
一个非常简单的修复。不要在builder.add方法的第一个参数中转义前斜杠字符。
builder.add("/", " ");