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

C# 如何自定义Lucene.NET以搜索带有符号且不区分大小写的单词(例如“C”或“NET”)?,c#,.net,lucene,lucene.net,C#,.net,Lucene,Lucene.net,标准分析仪不工作。据我所知,它将此更改为搜索c和net WhitespaceAnalyzer可以工作,但它区分大小写 一般规则是搜索应该像谷歌一样工作,所以希望它是一种配置,考虑到.net,c已经存在一段时间了,或者有一个解决方法 根据下面的建议,我尝试了自定义的WhitespaceAnalyzer,但是如果关键字用逗号分隔,并且没有空格,则无法正确处理,例如 java,.net,c#,oracle 搜索时将不会返回,这将是不正确的 我遇到了patternalyzer,它用于分割令牌,但不知

标准分析仪不工作。据我所知,它将此更改为搜索
c
net

WhitespaceAnalyzer
可以工作,但它区分大小写

一般规则是搜索应该像谷歌一样工作,所以希望它是一种配置,考虑到
.net
c
已经存在一段时间了,或者有一个解决方法

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

java,.net,c#,oracle 
搜索时将不会返回,这将是不正确的

我遇到了
patternalyzer
,它用于分割令牌,但不知道在这种情况下如何使用它


我正在使用
Lucene.Net 3.0.3
.Net 4.0
编写自己的自定义分析器类,类似于中的
同义词分析器。您对
TokenStream
的重写可以通过使用
WhitespaceTokenizer
LowerCaseFilter
对流进行管道化来解决这个问题

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

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

如果只需要处理无空格逗号分隔的关键字进行搜索,而不需要编制索引,则可以将搜索表达式转换为
expr
,如下所示

expr = expr.Replace(',', ' ');
然后将
expr
传递给
QueryParser
。如果要支持其他分隔符,如“;”你可以这样做:

var terms = expr.Split(new char[] { ',', ';'} );
expr = String.Join(" ", terms);
"sybase,c#,.net,oracle" server,c#,.net,sybase
server,c#,.net,sybase
但您还需要检查短语表达式,如“sybase、c#、.net、oracle”(表达式包括不应转换的引号“chars”)(用户正在寻找精确匹配):

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

var terms = expr.Split(new char[] { ',', ';'} );
expr = String.Join(" ", terms);
"sybase,c#,.net,oracle" server,c#,.net,sybase
server,c#,.net,sybase
然后,您需要解析搜索表达式并将其转换为:

"sybase,c#,.net,oracle" server c# .net sybase
如果还需要处理无空格逗号分隔的关键字进行索引,则需要解析无空格逗号分隔的关键字的文本,并将其存储在不同的字段中,例如
关键字
(必须与自定义分析器相关联)。然后,搜索处理程序需要转换如下搜索表达式:

var terms = expr.Split(new char[] { ',', ';'} );
expr = String.Join(" ", terms);
"sybase,c#,.net,oracle" server,c#,.net,sybase
server,c#,.net,sybase
为此:

Keywords:server Keywords:c# Keywords:.net, Keywords:sybase
或者更简单地说:

Keywords:(server, c#, .net, sybase)

使用
WhiteSpaceRanAnalyzer
并将其与

在搜索和索引时使用相同的链。通过将所有内容转换为小写,实际上使其不区分大小写


根据您的问题描述,这应该是可行的,并且易于实现。

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

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

尝试过,但它无法识别由谷歌完成的关键词,如oracle、.net、c#、sybase等,这是我们用户的黄金标准如果可能的话,我们将查看更多信息可能会定制标记器这是搜索和索引所需的,关于解析到单独字段的有趣想法,但考虑到我们必须处理say.net4/.net4.5等,而不是.net*(静默)这将是更多的工作搜索等。如果我想不出一种定制标记器的方法,那么我必须做一些类似的事情。这是你的域源代码?或者这些只是示例?@phani这些只是示例。你有没有可能发布它的要点?听起来很有用