Solr 6.5如何配置copyField复制attr_*字段但排除attr_K*
解决Solr 6.5中copyField排除特定前缀字段的问题
首先得说明:Solr的<copyField>指令本身并不支持直接排除通配符匹配项的语法,所以我们得用两种可行的方案来实现你的需求——复制所有attr_*前缀字段(除了attr_K*),同时保留另外10个字段复制到defaultSearch。
方案1:显式列出需要复制的字段(适合前缀数量少的场景)
如果你的attr_*前缀只有A-Z(仅排除K),直接显式定义每个需要复制的前缀,再加上那10个独立字段就好:
<!-- 复制除attr_K*外的所有attr_前缀字段 --> <copyField source="attr_A*" dest="defaultSearch"/> <copyField source="attr_B*" dest="defaultSearch"/> <copyField source="attr_C*" dest="defaultSearch"/> <!-- ... 依次补充attr_D*到attr_J*、attr_L*到attr_Z*的配置 --> <!-- 复制另外10个独立字段 --> <copyField source="field1" dest="defaultSearch"/> <copyField source="field2" dest="defaultSearch"/> <!-- ... 补充剩余8个字段的配置 -->
这种方法的优势是配置简单直接,不需要额外的处理器,适合字段前缀数量有限的场景。
方案2:用UpdateRequestProcessorChain实现动态过滤(适合前缀数量多的场景)
如果attr_*前缀数量很多,显式列出太繁琐,可以通过自定义更新处理器链来过滤掉attr_K*字段的复制:
步骤1:在solrconfig.xml中定义处理器链
添加一个包含FieldNameMutatingUpdateProcessorFactory的处理器链,专门用来排除attr_K*字段:
<updateRequestProcessorChain name="excludeAttrK"> <processor class="solr.FieldNameMutatingUpdateProcessorFactory"> <str name="pattern">attr_K.*</str> <str name="replacement"></str> <bool name="preserveOriginal">true</bool> </processor> <processor class="solr.RunUpdateProcessorFactory"/> </updateRequestProcessorChain>
步骤2:修改schema.xml的copyField配置
先复制所有attr_*到defaultSearch,再通过处理器链过滤掉attr_K*的内容:
<!-- 先复制所有attr_*到defaultSearch --> <copyField source="attr_*" dest="defaultSearch"/> <!-- 复制另外10个独立字段 --> <copyField source="field1" dest="defaultSearch"/> <!-- ... 补充剩余9个字段的配置 -->
步骤3:指定使用该处理器链
在solrconfig.xml的<requestHandler name="/update">中,全局指定使用我们定义的处理器链:
<requestHandler name="/update" class="solr.UpdateRequestHandler"> <lst name="defaults"> <str name="update.chain">excludeAttrK</str> </lst> </requestHandler>
这个方案的原理是:文档更新时,处理器会匹配attr_K*字段,把它们从要复制到defaultSearch的内容中移除,同时保留原始字段不受影响。
注意事项
- 两种方案都需要重启Solr服务才能生效。
- 如果不需要全局过滤,方案2可以改成在更新请求的参数中指定
update.chain=excludeAttrK,而不是全局配置。 - 测试时建议添加一个包含
attr_Kxx字段的文档,查询defaultSearch字段确认该内容没有被复制进去。
内容的提问来源于stack exchange,提问作者raj247
相关产品推荐
相关产品推荐

