6

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

会起作用,WhitespaceAnalyzer但它区分大小写。

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

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

java,.net,c#,oracle 

搜索不正确时不会返回。

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

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

4

3 回答 3

7

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

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

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

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

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

然后传递exprQueryParser. 如果您想支持其他分隔符,例如 ';' 你可以这样做:

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

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

server,c#,.net,sybase

对此:

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

或更简单地说:

Keywords:(server, c#, .net, sybase)
于 2013-02-22T10:56:23.357 回答
4

使用WhitespacerAnalyzer并将其与LowerCaseFilter 链接

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

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

于 2013-02-23T03:12:17.630 回答
-2

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

最终的答案是使用该令牌过滤器以及 Whitespacetokenizer、lowercasefilter 等创建自定义 TokenFilter 和自定义分析器,总共大约 30 行代码,我将创建一篇博客文章并在我这样做时在此处发布链接,必须先创建一个博客!

于 2013-03-07T16:36:06.877 回答