如何自定义Lucene.NET以搜索带符号的单词而不区分大小写(例如"C#"或".net")?

Kum*_*mar 6 .net c# lucene lucene.net

标准分析仪不起作用.根据我的理解,它将此更改为搜索cnet

WhitespaceAnalyzer会工作,但它区分大小写.

一般规则是搜索应该像谷歌一样工作,所以希望它是一个配置的东西考虑.net,c#已经在那里一段时间或有一个解决方法为此.

根据下面的建议,我尝试了自定义,WhitespaceAnalyzer但如果关键字用逗号分隔,并且没有正确处理空格,例如

java,.net,c#,oracle 
Run Code Online (Sandbox Code Playgroud)

搜索时不会返回不正确的内容.

我遇到过PatternAnalyzer用于分割令牌但却无法弄清楚如何在这种情况下使用它.

我正在使用Lucene.Net 3.0.3.NET 4.0

gro*_*boy 7

写自己的自定义分析仪类似于类SynonymAnalyzerLucene.Net -自定义同义词分析.您的覆盖TokenStream可以通过使用WhitespaceTokenizer和管道流来解决这个问题LowerCaseFilter.

请记住,您的索引器和搜索器需要使用相同的分析器.

更新:处理多个逗号分隔的关键字

如果您只需要处理用于搜索的未间隔逗号分隔关键字,而不是索引,那么您可以将搜索表达式转换expr为如下所示.

expr = expr.Replace(',', ' ');
Run Code Online (Sandbox Code Playgroud)

然后expr转到QueryParser.如果你想支持其他分隔符,比如';' 你可以这样做:

var terms = expr.Split(new char[] { ',', ';'} );
expr = String.Join(" ", terms);
Run Code Online (Sandbox Code Playgroud)

但是你还需要检查一个短语表达式,比如"sybase,c#,.net,oracle"(表达式包含引号"chars"),它不应该被转换(用户正在寻找完全匹配):

expr = expr.Trim();
if (!(expr.StartsWith("\"") && expr.EndsWith("\"")))
{
    expr = expr.Replace(',', ' ');
}
Run Code Online (Sandbox Code Playgroud)

表达式可能包含短语和一些关键字,如下所示:

"sybase,c#,.net,oracle" server,c#,.net,sybase
Run Code Online (Sandbox Code Playgroud)

然后,您需要解析并将搜索表达式翻译为:

"sybase,c#,.net,oracle" server c# .net sybase
Run Code Online (Sandbox Code Playgroud)

如果您还需要处理用于索引的未间隔逗号分隔关键字,则需要解析未间隔逗号分隔关键字的文本并将其存储在不同的字段中,例如.Keywords(必须与您的自定义分析器相关联).然后你的搜索处理程序需要转换搜索表达式,如下所示:

server,c#,.net,sybase
Run Code Online (Sandbox Code Playgroud)

对此:

Keywords:server Keywords:c# Keywords:.net, Keywords:sybase
Run Code Online (Sandbox Code Playgroud)

或更简单地说:

Keywords:(server, c#, .net, sybase)
Run Code Online (Sandbox Code Playgroud)


Kum*_*mar -2

对于其他可能也在寻找答案的人

最终的答案是使用该令牌过滤器以及 Whitespacetokenizer、lowercasefilter 等创建一个自定义 TokenFilter 和一个自定义分析器,总共大约 30 行代码,我将创建一篇博客文章并在此处发布链接,必须先创建一个博客!