我想在索引中搜索特殊字符.
我在查询字符串中转义了所有特殊字符,但是当我在索引中对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)方法来打破您不需要的角色.