Solr PatternReplaceFilterFactory处理不匹配的值

时间:2013-11-06 12:12:39

标签: regex solr indexing

我有一个字段,用于按文档名称的某个部分对文档进行分类。大多数文档的名称都遵循一个模式,如两个字符后跟两个小数,依此类推......我想要提取的是前两个字符,它们使用以下定义。

<filter class="solr.PatternReplaceFilterFactory"
                pattern="^.*(\D{2})\d{2}.*$" replacement="$1" replace="all"/>

这里的问题是不匹配的条目被它们的确切名称索引,但我希望它们站在“未分类”下,我需要一种方法来替换它。你会怎么做?

1 个答案:

答案 0 :(得分:1)

您可以在模式替换过滤器后使用length filter,前提是与您的模式不匹配的文档的字段长度始终为3或更长:

<filter class="solr.PatternReplaceFilterFactory"
                pattern="^.*(\D{2})\d{2}.*$" replacement="$1" replace="all"/>
<filter class="solr.LengthFilterFactory" min="1" max="2" />

这将使所有与您的模式不匹配的文档的字段为空。

但是,如果您希望字段值对于此类情况为“未分类”,请使用另一个PatternReplaceFilterFactory跟随长度过滤器,该替换使用'uncategorized'替换空标记:

<filter class="solr.PatternReplaceFilterFactory"
                    pattern="^$" replacement="uncategorized"/>

或者:您可以直接使用'uncategorized'替换长度为3或更多的所有令牌,如下所示:

<filter class="solr.PatternReplaceFilterFactory"
                    pattern="^.*(\D{2})\d{2}.*$" replacement="$1" replace="all"/>
<filter class="solr.PatternReplaceFilterFactory"
                    pattern="^.{3,}$" replacement="uncategorized" replace="all"/>