去重複

如果您的索引中存在重複或近乎重複的文件,則可能值得實作去重複。

使用低碰撞或模糊雜湊演算法,可以有效地防止重複或近乎重複的文件進入索引,或使用簽章/指紋標記文件以進行重複欄位摺疊。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

用於產生簽章雜湊的簽章實作。

必須指定實作的完整類別路徑。上述說明了可用的選項,要使用的相關類別路徑為

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

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

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

fields

選用

預設值:所有欄位

用於產生雜湊簽章的欄位,以逗號分隔的清單表示。依預設,將會使用文件上的所有欄位。

signatureField

選用

預設值:signatureField

用於存放指紋/簽名的欄位名稱。此欄位應在您的綱要中定義。

已啟用

選用

預設值:true

設為 false 以停用重複資料刪除處理。

覆寫重複項目

選用

預設值:true

如果為 true,當存在與此簽名匹配的文件時,將會覆寫該文件。如果您使用 overwriteDupes=true,則您的綱要中 signatureField 必須為 indexed="true"

在 SolrCloud 中使用 SignatureUpdateProcessorFactory

在 SolrCloud 中使用 SignatureUpdateProcessorFactory 時,有 2 個重要的注意事項:

  1. overwriteDupes=true 設定 *僅* 在特殊情況下,使用 uniqueKey 欄位作為 signatureField 時才有效。在任何其他 signatureField 上嘗試重複資料刪除將無法正確運作,因為更新會轉發到副本的方式。

  2. 當使用 uniqueKey 欄位作為 signatureField 時,SignatureUpdateProcessorFactory 必須在 DistributedUpdateProcessor 之前執行,以確保文件可以根據 (產生的) uniqueKey 欄位路由到正確的分片領導者。

(使用任何其他 signatureFieldoverwriteDupes=false — 為每個文件產生簽名而不進行重複資料刪除 — 沒有任何限制。)