如何在Lucene中搜索特殊字符(+!\?:)

use*_*024 11 lucene

我想在索引中搜索特殊字符.

我在查询字符串中转义了所有特殊字符,但是当我在索引中对lucene执行查询时,它将查询创建为+().

因此它搜索没有字段.

如何解决这个问题呢?我的索引包含这些特殊字符.

Gen*_*sky 11

如果您正在使用StandardAnalyzer,那将丢弃非孤立字符.尝试使用a索引相同的值,WhitespaceAnalyzer并查看是否保留了所需的字符.它也可能包含你不想要的东西:那时你可能会考虑编写自己的Analyzer,这基本上意味着创建一个TokenStream堆栈,它完全可以完成你需要的那种处理.

例如,SimpleAnalyzer实现以下管道:

@Override
public TokenStream tokenStream(String fieldName, Reader reader) {
   return new LowerCaseTokenizer(reader);
}
Run Code Online (Sandbox Code Playgroud)

只是降低了令牌.

StandardAnalyzer做得更多:

/** Constructs a {@link StandardTokenizer} filtered by a {@link
StandardFilter}, a {@link LowerCaseFilter} and a {@link StopFilter}. */
@Override
public TokenStream tokenStream(String fieldName, Reader reader) {
    StandardTokenizer tokenStream = new StandardTokenizer(matchVersion, reader);
    tokenStream.setMaxTokenLength(maxTokenLength);
    TokenStream result = new StandardFilter(tokenStream);
    result = new LowerCaseFilter(result);
    result = new StopFilter(enableStopPositionIncrements, result, stopSet);
    return result;
 }
Run Code Online (Sandbox Code Playgroud)

您可以混合使用这些组件和其他组件org.apache.lucene.analysis,也可以编写自己的专用TokenStream实例,这些实例由您的自定义包装到处理管道中Analyzer.

另一件要看的是CharTokenizer你正在使用什么样的东西.CharTokenizer是一个抽象类,它指定用于标记文本字符串的机制.它被一些更简单的分析仪使用(但不是由StandardAnalyzer).Lucene有两个子类:a LetterTokenizer和a WhitespaceTokenizer.您可以创建自己的角色来保留您需要的角色,并通过实施该boolean isTokenChar(char c)方法来打破您不需要的角色.