1

Solr 被用于搜索用户生成列表的数据库。这些清单通过 DataImportHandler 从 MySQL 导入到 Solr。

问题:很多时候,用户向数据库报告相同的列表,有时会对其列表帖子进行细微更改,以避免被轻易检测为重复帖子。

我应该如何使用 Solr 实现近似重复检测?只要搜索结果不包含这些近乎重复的列表,我不介意在 Solr 索引中有近乎重复的列表。

我想有 4 个可能的地方可以进行这种近乎重复的检测

  1. 当用户提交列表时(此处使用 PHP)
  2. 在从 MySQL 到 Solr 的数据导入期间
  3. 从 MySQL 导入数据后
  4. 搜索完成时

推荐的方法是什么?谢谢!

4

1 回答 1

3

我不熟悉 Solr,我会在用户提交列表时实现“近乎重复”。有很多不同的算法可以检测像Jaccard Indexing这样的近似重复。

我做了一个小脚本来查看相似系数之间的差异:

<?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 回答