当我的输入字符串包含像c ++这样的术语时,我如何确保lucene能够返回相关的搜索结果? Lucene似乎忽略了++字符。
代码详情: 当我执行这一行时,我得到一个空白的搜索查询。
queryField = multiFieldQueryParser.Parse(inpKeywords);
keywordsQuery.Add(queryField, BooleanClause.Occur.SHOULD);
这是我的自定义分析器:
public class CustomAnalyzer : Analyzer
{
private static readonly WhitespaceAnalyzer whitespaceAnalyzer = new WhitespaceAnalyzer();
public override TokenStream TokenStream(String fieldName, System.IO.TextReader reader)
{
TokenStream result = whitespaceAnalyzer.TokenStream(fieldName, reader);
result = new StandardTokenizer(reader);
result = new LowerCaseFilter(result);
result = new StopFilter(result, stop_words);
return result;
}
}
我正在以这种方式执行搜索查询:
indexSearcher.Search(searchQuery, collector);
我确实尝试过queryField = multiFieldQueryParser.Parse(QueryParser.Escape(inpKeywords));,但它仍然无效。这是执行的查询并返回零点击。 “+(())”
感谢。
答案 0 :(得分:3)
由于+
是一个特殊字符,因此需要对其进行转义。需要转义的所有字符的列表是here(请参阅页面底部。)
您还需要注意索引时使用的分析仪。例如,StandardAnalyzer将跳过+
。在索引和搜索时,您可能需要使用类似WhiteSpaceAnalyzer的东西,这将保留令牌流中的特殊字符。请记住,在索引和搜索时需要使用相同的分析器。
答案 1 :(得分:1)
除了选择合适的分析器外,您还可以使用QueryParser.Escape(string s)
确保所有特殊字符都被正确转义。
因为这是静态函数,所以即使您使用的是MultiFieldQueryParser,也可以使用它。
例如,您可以尝试这样的事情:
queryField = multiFieldQueryParser.Parse(QueryParser.Escape(inpKeywords));
答案 2 :(得分:0)
尝试对搜索查询进行UTF-8编码。
您可以按照this article
中的说明启用此功能