1

Solrは、ユーザーが生成したリストのデータベースを検索するために使用されています。これらのリストは、DataImportHandlerを介してMySQLからSolrにインポートされます。

問題:多くの場合、ユーザーは同じリストをデータベースに報告しますが、重複した投稿として簡単に検出されないように、リストの投稿に小さな変更を加えることもあります。

Solrを使用して重複に近い検出を実装するにはどうすればよいですか?検索結果にこれらのほぼ重複するリストが含まれていない限り、Solrインデックスにほぼ重複するリストが含まれていてもかまいません。

このほぼ重複した検出を行うための4つの可能な場所があると思います

  1. ユーザーがリストを送信したとき(ここではPHPが使用されています)
  2. MySQLからSolrへのデータインポート中
  3. MySQLからのデータインポート後
  4. 検索中の場合

これを行うための推奨される方法は何ですか?ありがとうございました!

4

1 に答える 1

3

私はSolrに精通していないので、ユーザーがリストを送信するときに「ほぼ複製」を実装します。JaccardIndexingのようなほぼ重複を検出するためのさまざまなアルゴリズムがあります。

類似係数の違いを確認するために、小さなスクリプトを作成しました。

<?php

$input1 = "Hello there, this is a test 1, you see it's almost the same";
$input2 = "Hello there, this is a test 2, you saw it, it's almost the same";
$input3 = "this is very different from the others, but who knows ?";

echo jackard($input1, $input1) . "<br />"; // results 1

echo jackard($input1, $input2) . "<br />"; // results 0.81481481481481

echo jackard($input1, $input3) . "<br />"; // results 0.25

echo jackard($input2, $input3); // results 0.24


function jackard($a, $b){
    $a_arr = explode(" ", $a);
    $b_arr = explode(" ", $b);
    $intersect_a_b = array_intersect($a_arr,$b_arr);
    return((count($intersect_a_b)/(count($a_arr)+count($b_arr)))*2);
}
?>

結果が1の場合、それは同じ文であるか、同じ単語を異なる順序で使用していることを意味していることがわかります。ただし、値が小さいほど、「文」は一意になります。これはかなり単純な実装です。0.4などの制限値を設定できます。そして、この制限を超えた場合は、キューに「リクエスト」を設定します。そして、リストを手動で見てください。これは「効率的」ではありません。しかし、私はあなたにアイデアを与えました、そしてより複雑で自動化されたシステム/アルゴリズムを開発するのはあなた次第です。そして多分あなたもここを見てみるべきです。

于 2012-10-07T10:40:38.290 に答える