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

前端之家收集整理的这篇文章主要介绍了如何自定义Lucene.NET以搜索带符号的单词而不区分大小写(例如“C#”或“.net”)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
标准分析仪不起作用.根据我的理解,它将其更改为搜索c和net

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

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

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

java,.net,c#,oracle

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

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

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

解决方法

Lucene.Net – Custom Synonym Analyzer中编写类似于SynonymAnalyzer的自定义分析器类.您的TokenStream重写可以通过使用WhitespaceTokenizer和LowerCaseFilter对流进行流水线操作来解决此问题.

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

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

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

expr = expr.Replace(',',' ');

然后将expr传递给QueryParser.如果你想支持其他分隔符,比如’;’你可以这样做:

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

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

expr = expr.Trim();
if (!(expr.StartsWith("\"") && expr.EndsWith("\"")))
{
    expr = expr.Replace(',' ');
}

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

"sybase,oracle" server,sybase

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

"sybase,oracle" server c# .net sybase

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

server,sybase

对此:

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

或更简单地说:

Keywords:(server,sybase)

猜你在找的C#相关文章