去重

如果重复或近似重复的文档是您索引中关注的问题,则值得实施重复数据删除。

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

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

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

  • TextProfileSignature:Apache Nutch 中用于近似重复检测的模糊哈希实现。它可调,但在较长的文本上效果最佳。

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

添加重复数据删除过程将更改 allowDups 设置,使其应用于更新项(在这种情况下为 signatureField),而不是唯一字段项。

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

配置选项

在 Solr 中有两个位置可以配置重复数据删除:solrconfig.xml架构

在 solrconfig.xml 中

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

<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

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

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

  • 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 时,有两件重要的事情需要记住

  1. overwriteDupes=true 设置不起作用,除非 在特殊情况下使用 uniqueKey 字段作为 signatureField。尝试对任何其他 signatureField 进行重复数据删除都不会正常工作,因为更新是如何转发到副本的

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

(在 overwriteDupes=false 的情况下使用任何其他 signatureField — 为每个文档生成签名而无需重复数据删除 — 没有限制。)