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

标签 c# .net lucene lucene.net

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

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

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

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

java,.net,c#,oracle 

在搜索时不会返回错误。

我遇到了用于拆分 token 的 PatternAnalyzer,但不知道如何在这种情况下使用它。

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

最佳答案

编写您自己的自定义分析器类,类似于 Lucene.Net – Custom Synonym Analyzer 中的 SynonymAnalyzer .您对 TokenStream 的覆盖可以通过使用 WhitespaceTokenizerLowerCaseFilter 流水线化来解决这个问题。

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

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

如果您只需要为搜索处理以逗号分隔的无空格关键字,而不是索引,那么您可以如下转换搜索表达式expr

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

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

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

但您还需要检查短语表达式,如“sybase,c#,.net,oracle”(表达式包含引号“字符),不应转换(用户正在寻找完全匹配):

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

如果您还需要为索引 处理非空格逗号分隔的关键字,那么您需要解析非空格逗号分隔关键字的文本并将它们存储在不同的字段中,例如。 关键字(必须与您的自定义分析器相关联)。然后您的搜索处理程序需要像这样转换搜索表达式:

server,c#,.net,sybase

为此:

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

或者更简单地说:

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

关于c# - 如何自定义 Lucene.NET 以搜索不区分大小写的带符号的单词(例如 "C#"或 ".net")?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15016473/

相关文章:

c# - 自定义 ILogger 实现和额外/自定义字段?

c# - Web API 将输入转换为随机 int

c# - 将控件的大小重置为其默认值

java - 使用lucene提取关键词时出错

c# - 从 MemberExpression 获取链接的属性名称

c# - c++\cli 项目依赖的 c++ dll 未复制到 c# 输出目录

c# - 用于检索查询字符串的方法中的return语句的更好语法

lucene - Elasticsearch可以提出映射建议吗?

java - Lucene 不是空查询?

c# - ASP.NET:如何创建可扩展的空 TreeNode