重複したドキュメントを削除するためのSOLRの構文は何ですか?

トピック作成者:ks-solruserml-bot (2024/09/01 21:25 投稿)
7
OpenOpen

(The bot translated the original post https://lists.apache.org/thread/ljgnfnkpfx8dgln3ksgzx2w6npjlpofs into Japanese and reposted it under Apache License 2.0. The copyright of posted content is held by the original poster.)

SOLR 8.Xを使用しています。あるコアに重複したドキュメントがあるのではないかと疑っており、これらの重複したドキュメントを削除したいと考えています。しかし、SOLRガイドにあるようなSignature機能は実装されていません。https://solr.apache.org/guide/6_6/de-duplication.html

SQLであれば、ハッシュカラムを使用しないクエリは次のようになります:

;WITH CTE AS
(
SELECT cols,
RN = ROW_NUMBER() OVER(PARTITION BY cols ORDER BY updated DESC)
FROM [table]
)
DELETE FROM CTE
WHERE RN > 1

SOLRクエリではどのような構文になるのでしょうか?

返信投稿者:ks-solruserml-bot (2024/09/01 21:26 投稿)

2つのドキュメントが重複していると判断するのはいつですか?1つのフィールドが同じ値を持っている場合、複数のフィールドが同じ値を持っている場合、またはすべてのフィールドが同じ場合など、どの条件で判断しますか?

返信投稿者:ks-solruserml-bot (2024/09/01 21:26 投稿)

すべてのフィールドが同じであれば、それが重複したドキュメントとなります。

まず、それらを削除したいと考えています。

返信投稿者:ks-solruserml-bot (2024/09/01 21:26 投稿)

こんにちは、Vince。

重複を引き起こしたインデックス作成プロセスを修正し、ソースデータからインデックスを再構築することをお勧めします。いずれにしても、それは常にできるようにしておくべきことです。

Thomas

返信投稿者:ks-solruserml-bot (2024/09/01 21:26 投稿)

Thomasの言うことに同感です。この問題は、インデックスシステムに大きな設計上の欠陥があることを示している可能性があります。ほとんどのシステムでは、Solr外部に文書のアイデンティティを持たせる概念が必要であり、それがSolr内のIDとして使用されるべきです。これを行わない場合、文書が二重に送信されないことを保証するという潜在的に難しい問題を解決しなければならなくなります(または、重複を気にしない)。この問題がそれほど難しくない限られた状況(すべてのデータが毎晩新しいインデックスに再インデックスされるシステムなど)もありますが、通常は文書が二重に送信されないことを保証するのは非常に難しいです。同じIDを持たせることで、重複が互いに上書きされるようにする方が、安全なことが多いです。

推測ですが、おそらくGUIDをキー項目の値として生成しているか、類似のランダムな何かを使用しているのではありませんか?もしそうなら、それは避けるべきです。それは、まさに今経験しているような問題を引き起こすショートカットです。

また、インデックス全体を再構築できないのは非常に悪い状態にあることも覚えておいてください。提供されたリファレンスガイドのリンクに基づいて6.6を使用している場合、多くのセキュリティの脆弱性が修正されているため、必ずアップグレードするべきです。6から8または9へのアップグレードには、すべてを再インデックスすることが必須です。

以上のことを述べた上で、もし単に数件の誤り、例えば開発者が誤って本番システムに送信した十数件の不正な文書を削除するだけであれば、文書の削除に関する情報は以下のリファレンスガイドに記載されています:

https://solr.apache.org/guide/solr/latest/getting-started/tutorial-diy.html#deleting-data

-Gus

返信投稿者:ks-solruserml-bot (2024/09/01 21:27 投稿)

もし「既知の正しい」IDのリストを生成できるなら、「*:* AND -id:X AND -id:Y ...」のようなクエリで、誤ったものを見つけることができます...ただし、POSTサイズを超えない限りです。

もし Solrが主要なストレージではない場合、インデックスをゼロから再ロードすることができます。その際に、主キーの問題を修正するのが理想的です。

ドキュメントを一時的なSQLiteやPostgresのテーブルにダンプし、SQLの「OVER」トリックを使うこともできます。もしドキュメントに自然キーがない場合、それが唯一の方法かもしれません。

(もし自然キーがあり、インデックスでGUIDを使用している場合、GUID3/5が役に立ちます。GUIDを使用し続けつつ、それをメタ安定的に保つことができます。)

Dima

返信投稿者:ks-solruserml-bot (2024/09/01 21:27 投稿)

インデックス内で繰り返し使用されているIDを見つけるには、こちらを参照し、terms.mincount=2を設定します。または、同じことをファセットを使用して行うこともできます。

例えば、

q=*:*&facet=true&facet.field=id&facet.limit=-1&facet.mincount=2

のようにクエリを作成します(これは私の頭の中にある例です)。

その後、重複したIDを一つ一つクエリで確認することができます。厳密に一意のフィールドが割り当てられていない場合、重複を削除することはできません。[docid] を使用して内部の一意の識別子(ROW_NUMBERに類似するもの)を取得することができます。詳細は こちら を参照してください。

ただし、この番号を受け入れるクエリが存在するかどうかは私は知りません。

よろしくお願いします、
Mikhail Khludnev

返信投稿者:ks-solruserml-bot (2024/09/01 21:27 投稿)

おそらく元の質問にはあまり役立たないかもしれませんが、完全性を期すために言うと、Luceneの documentID を Luke Request Handler で使用することができます。

こちらを参照してください。

ただし、documentID をSolrドキュメントの信頼できる識別子として使用することはできません。Luceneは、最適化やマージなどの操作中にそれを変更する可能性があります。

Thomas

トピックへ返信するには、ログインが必要です。

KandaSearch

Copyright © 2006-2024 RONDHUIT Co, Ltd. All Rights Reserved.

投稿の削除

この投稿を削除します。よろしいですか?