【问题标题】:Lucene QueryParser Analyzer inconsistencyLucene QueryParser 分析器不一致
【发布时间】: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


【解决方案1】:

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

builder.add("/", " ");

【讨论】:

    猜你喜欢
    • 2019-05-12
    • 2011-08-28
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2010-09-20
    相关资源
    最近更新 更多