微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何自定义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)

原文地址:https://www.jb51.cc/csharp/243160.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐