2

我的 mysql 数据库中有 2,000,000 个字符串。现在,当输入一个新字符串时,我尝试找出该字符串是否已经在我的数据库中,否则,我插入该字符串。

字符串匹配的定义

就我而言,文本中单词的位置无关紧要。字符串中只应出现所有单词,并且任何一个字符串中都不应出现多余的单词。

Ex - Ram is a boy AND boy is a Ram将被称为匹配。拉姆是个不配的好孩子

PS - 请忽略意义

现在,我的问题是,考虑到我必须匹配的字符串数量(2,000,000),进行这些匹配的最佳方法是什么。

我能想到的解决方案:

  1. 索引 SOLR/Sphinx 中的所有字符串
  2. 在新搜索中,我将只访问搜索服务器,并且必须考虑最多前 10 个字符串

好处 :-

  1. 比mysql全文搜索更快

缺点:-

  1. 使用 mysql 数据库中的新查询保持搜索服务器的更新。

我还有其他更好的解决方案吗?任何解决此问题的建议和方法都非常受欢迎:)

谢谢 !

4

3 回答 3

2

您可以只计算第二列,其中包含按排序顺序排列的单词。然后只是该列上的唯一索引:)

ALTER TABLE table ADD sorted varchar(255) not null, unique index(sorted);

然后...(PHP为方便起见,但其他语言将类似)

$words = explode(' ',trim($string));
sort($words);
$sorted = mysql_real_escape_string(implode(' ',$words));
$string = mysql_real_escape_string($string);

$sql = "INSERT IGNORE INTO table SET `string`='$string',`sorted`='$sorted'";
于 2013-10-08T05:23:41.423 回答
1

我建议创建更多表来存储有关您现有数据的信息。这样无论您的表有多少数据,您都不必在查询中的“匹配/检查和插入”逻辑期间处理性能问题。

请检查我在另一篇关于 SO 的帖子中针对类似要求提出的架​​构建议。

适应模糊匹配

在上面的帖子中,为了满足您的需求,您只需要一张额外的表格,我提到的数据匹配准确率为 90%。如果该答案不清楚或您对此有任何疑问,请告诉我。

编辑-1

在您的情况下,您将有 3 张桌子。您已经拥有一个,其中存储了 2,000,000 条字符串消息。现在我正在谈论的另外两个表如下。第二个表存储所有唯一的表达式(所有消息中的唯一词)第三个表存储每个表达式(词)和该词出现的消息之间的链接。请参阅下面的查询结果。

在此处输入图像描述

在此处输入图像描述

现在假设您的输入有一个字符串“Is Boy Ram”,首先从这个字符串中有 3 个的字符串中提取每个表达式。“是”、“拉姆”和“男孩”。现在只需完成 Select 查询以查看这些所有表达式是否存在于单个 StringID 的最后一个表“MyData_ExpressionString”中。我想现在你有更好的画面,你知道下一步该做什么。是的,我还没有创建索引,但我想你已经知道你需要什么索引了。

于 2013-10-08T04:26:54.497 回答
0

通过将所有单词添加到给定字符串的过滤器中,计算每个字符串的布隆过滤器。在任何新的字符串查找中,计算布隆过滤器,并在数据库中查找匹配的字符串。

您可能可以使用相当短的布隆过滤器,对您的字符串进行一些测试可以告诉您需要多长时间。

于 2013-10-08T04:00:37.580 回答