solr PatternReplaceCharFilterFactory意外工作

时间:2013-03-04 22:29:11

标签: regex search solr

我对Solr比较新,所以如果我错过了一些明显的东西,请原谅我。我有一个应用程序,允许用户搜索音乐艺术家。索引来自一个具有正确拼写的只读数据库,因此在索引方面我已经弄明白了。

在查询方面,我需要预测各种拼写错误/差异,并希望帮助solr找到这些实例。从我们原有的本土搜索解决方案中,我有一个正则表达式列表和他们适用的艺术家。当我试图使用PatternReplaceCharFilterFactory将它们转换为solr时,我注意到有些工作完美,而其他人根本没有工作......看起来没有押韵也没有理由。

例如:

<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="em[ei]n[ei]m" replacement="Eminem"/>

准确地捕捉了Eminem的常见拼写错误。但对于乐队311:

<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[Tt]hree [Ee]leven" replacement="311"/>

不起作用。另一个例子是Nine Inch Nails:

<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="((nine|9).*inch.*nails\b)|(n\.? ?i\.? ?n\.?\b)" replacement="Nine Inch Nails"/>

非常适合寻找乐队名称的最常见模式。但是对于Eve 6:

       <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[Ee]ve.{0,4}([Ss]ix|6)" replacement="Eve 6"/>

在使用此过滤器时,我是否缺少一些基本的东西?我已经尝试了上面提到的正则表达式的一些变体(即使使用像'三十一'这样的文字),但仍然没有成功。我已经尝试将有问题的过滤器作为分析器中唯一的PatternReplaceCharFilterFactory。我也确定这些项目在索引中是正确的,因为当我搜索正确的拼写时,它会返回正确的结果。

有什么建议吗?

Snowdall

2 个答案:

答案 0 :(得分:3)

我怀疑问题不在于您的Char Factory,而是因为毕竟是什么,特别是令牌化器。如果您使用标准标记器,它将删除您刚刚放入流中的数字。如果您不需要将文本拆分为令牌,则可以改为KeywordTokenizerFactory

通常,在Solr 4+中解决此问题的最佳方法是管理WebUI中的“分析”屏幕。它允许您根据特定字段类型输入文本,并查看分析链中每个组件之后发生的情况。

答案 1 :(得分:0)

我建议将SynonymFilter用于您描述的应用程序类型。它允许您提供一个外部文件,您可以在其中列出单词及其同义词,如:

eminem <=> emenem
nine <=> 9

如果您在此之前使用LowerCaseFilter,则不必在同义词中对案例规范化大惊小怪。只要你没有标记化,你就应该能够处理311案例(即使用像Alexander Rafalovitch所建议的KeywordTokenizer)。