如何自定义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中的 SynonymAnalyzer
– 自定义同义词分析器 。 您对TokenStream
重写可以通过使用WhitespaceTokenizer
和LowerCaseFilter
对流进行流水线操作来解决此LowerCaseFilter
。
请记住,您的索引器和搜索器需要使用相同的分析器。
更新:处理多个逗号分隔的关键字
如果您只需要处理用于搜索的未间隔逗号分隔关键字,而不是索引,那么您可以将搜索表达式expr
转换为如下所示。
expr = expr.Replace(',', ' ');
然后将expr
传递给QueryParser
。 如果你想支持其他分隔符,比如’;’ 你可以这样做:
var terms = expr.Split(new char[] { ',', ';'} ); expr = String.Join(" ", terms);
但是你还需要检查一个短语表达式,如“sybase,c#,。net,oracle”(表达式包括引号“chars”),不应转换(用户正在寻找完全匹配):
expr = expr.Trim(); if (!(expr.StartsWith(""") && expr.EndsWith("""))) { expr = expr.Replace(',', ' '); }
表达式可能包含短语和一些关键字,如下所示:
"sybase,c#,.net,oracle" server,c#,.net,sybase
然后,您需要解析并将搜索表达式翻译为:
"sybase,c#,.net,oracle" server c# .net sybase
如果您还需要处理用于索引的无空格逗号分隔关键字,则需要解析未间隔逗号分隔关键字的文本并将其存储在不同的字段中,例如。 Keywords
(必须与自定义分析器关联)。 然后你的搜索处理程序需要转换搜索表达式,如下所示:
server,c#,.net,sybase
对此:
Keywords:server Keywords:c# Keywords:.net, Keywords:sybase
或更简单地说:
Keywords:(server, c#, .net, sybase)
使用WhitespacerAnalyzer
并将其与LowerCaseFilter链接 。
在搜索和索引时使用相同的链。 通过将所有内容转换为小写,您实际上使它不区分大小写。
根据您的问题描述,这应该工作并且易于实现。
对于其他可能正在寻找答案的人
最终的答案是创建一个自定义TokenFilter和一个自定义分析器使用该令牌filter以及Whitespacetokenizer,lowercasefilter等,总共大约30行代码,我将创建一个博客post并在此处发布链接,首先要创建一个博客!
上述就是C#学习教程:如何自定义Lucene.NET以搜索带符号的单词而不区分大小写(例如“C#”或“.net”)?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/959423.html