Regex Solr PatternReplaceFilterFactory进程值不匹配

Regex Solr PatternReplaceFilterFactory进程值不匹配,regex,solr,indexing,Regex,Solr,Indexing,我有一个字段,用于按文档名称的某一部分对文档进行分类。大多数文档都有一个名称,它遵循两个字符后跟两个小数等模式。。。我想提取的是前2个字符,它使用以下定义 <filter class="solr.PatternReplaceFilterFactory" pattern="^.*(\D{2})\d{2}.*$" replacement="$1" replace="all"/> 这里的问题是,不匹配的条目会按照它们的确切名称编制索引,但我希望它们位于

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

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

这里的问题是,不匹配的条目会按照它们的确切名称编制索引,但我希望它们位于“未分类”下,我需要一种方法将其替换为类似的内容。如何执行此操作?

如果与您的模式不匹配的文档的字段长度始终为3或更多,则可以在模式替换过滤器之后使用:

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

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

但是,如果您希望在这种情况下字段值为“未分类”,则使用另一个PatternReplaceFilterFactory跟随长度过滤器,它将空标记替换为“未分类”:

<filter class="solr.PatternReplaceFilterFactory"
                    pattern="^$" replacement="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"/>

虽然这似乎有效,但它不是100%故障保护,但现在应该可以了:)谢谢