【发布时间】:2014-08-07 16:54:54
【问题描述】:
我有一个非常简单的 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
令人费解的是,当我调试分析器时,它正确地标记输入字符串,返回两个标记而不是一个。
发生了什么事?
谢谢。
【问题讨论】:
-
您知道,查询解析器会先于分析器处理文本,因此输入 f:foo/bar fill 可能会以类似 f:"foo bar" 的短语查询结束最佳情况,通过从查询解析器令牌中获取多个分析器令牌
标签: lucene analyzer query-parser