去重

如果您的索引中存在重复或近似重复的文档,则可能值得实施去重。

可以使用低冲突或模糊哈希算法,有效地防止重复或近似重复的文档进入索引,或者使用签名/指纹标记文档以进行重复字段折叠。Solr 通过 Signature 类原生支持这种类型的去重技术,并允许轻松添加新的哈希/签名实现。可以通过以下几种方式实现签名

  • MD5Signature:用于精确重复检测的 128 位哈希。

  • Lookup3Signature:用于精确重复检测的 64 位哈希。它比 MD5 快得多,而且索引更小。

  • TextProfileSignature:来自 Apache Nutch 的模糊哈希实现,用于近似重复检测。它是可调的,但最适合较长的文本。

以后可以添加其他更复杂的模糊/近似哈希算法。

添加去重过程将更改 allowDups 设置,使其应用于更新项(在本例中为 signatureField),而不是唯一的字段 Term。

当然,signatureField 可以是唯一字段,但通常您希望唯一字段是唯一的。当添加文档时,将自动生成签名并将其附加到指定的 signatureField 中的文档。

配置选项

可以在 Solr 中的两个位置配置去重:在 solrconfig.xml 中和在模式中。

在 solrconfig.xml 中

必须在 solrconfig.xml 中注册 SignatureUpdateProcessorFactory,作为更新请求处理器链的一部分,如下例所示

<updateRequestProcessorChain default="true">
  <processor class="solr.LogUpdateProcessorFactory" />
  <processor class="solr.processor.SignatureUpdateProcessorFactory">
    <str name="signatureField">id</str>
    <str name="fields">name,features,cat</str>
    <str name="signatureClass">solr.processor.Lookup3Signature</str>
  </processor>
  <processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>

SignatureUpdateProcessorFactory 采用多个属性

signatureClass

可选

默认值:org.apache.solr.update.processor.Lookup3Signature

用于生成签名哈希的 Signature 实现。

必须指定实现的完整类路径。上述介绍了可用的选项,要使用的关联类路径为

  • org.apache.solr.update.processor.Lookup3Signature

  • org.apache.solr.update.processor.MD5Signature

  • org.apache.solr.update.process.TextProfileSignature

fields

可选

默认值:所有字段

用于在逗号分隔列表中生成签名哈希的字段。默认情况下,将使用文档中的所有字段。

signatureField

可选

默认值:signatureField

用于保存指纹/签名的字段的名称。该字段应在您的模式中定义。

enabled

可选

默认值:true

设置为 false 可禁用去重处理。

overwriteDupes

可选

默认值:true

如果为 true,则当存在已经与此签名匹配的文档时,它将被覆盖。如果您使用 overwriteDupes=true,则 signatureField 在您的模式中必须是 indexed="true"

在 SolrCloud 中使用 SignatureUpdateProcessorFactory

在 SolrCloud 中使用 SignatureUpdateProcessorFactory 时,需要注意 2 个重要事项

  1. overwriteDupes=true 设置不生效,除非在特殊情况下使用 uniqueKey 字段作为 signatureField。尝试对任何其他 signatureField 执行去重都无法正常工作,因为更新会转发到副本。

  2. 当使用 uniqueKey 字段作为 signatureField 时,必须在 DistributedUpdateProcessor 之前运行 SignatureUpdateProcessorFactory,以确保文档可以基于(生成的)uniqueKey 字段路由到正确的分片领导者。

(使用任何其他 signatureFieldoverwriteDupes=false 来为每个文档生成签名而不进行重复数据删除,则没有限制。)