我的mysql数据库中有2,000,000个字符串。现在,当一个新字符串作为输入时,我试图找出该字符串是否已经在我的数据库中,否则,我插入字符串。
字符串匹配的定义
对于我的情况,文本中单词的位置无关紧要。只有所有单词都应该出现在字符串中,并且两个字符串中都没有多余的单词。
前 - 拉姆是一个男孩和男孩是拉姆将被称为匹配。 Ram是一个好孩子不会匹配。
PS - 请忽略感觉
现在,我的问题是,考虑到我必须匹配的字符串数量(2,000,000),这些匹配的最佳方法是什么。
解决方案我能想到:
优点: -
缺点: -
我还有其他更好的解决方案吗?任何建议和解决方法都非常受欢迎:)
谢谢!
答案 0 :(得分: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'";
答案 1 :(得分:1)
我建议创建一些存储有关现有数据信息的表。 因此,无论您的表有多少数据,您都不必在查询中的“匹配/检查和插入”逻辑期间处理性能问题。
请在SO上的另一篇文章中查看我针对类似要求提出的架构建议。
在上面的帖子中为了满足您的需求,您只需要一个额外的表格,我提到数据匹配,准确度达到90%。如果答案不明确或者您对此有任何疑问,请告诉我。
EDIT-1
在你的情况下,你将有3个表。你已经拥有的,存储了2,000,000个字符串消息的地方。现在另外两个我正在谈论的表如下。 存储所有唯一表达式的第二个表(所有消息中的唯一字) 第三个表存储每个表达(单词)和单词出现的messgae之间的链接。 请参阅以下查询结果。
现在让我们说你的输入有一个字符串“Is Boy Ram” 首先从字符串中提取每个表达式,在此字符串中有3个。 “是”,“拉姆”和“男孩”。 现在只需完成Select查询以查看最后一个表中是否存在这些所有表达式 单个StringID的“MyData_ExpressionString”。我想现在你有更好的画面,你知道接下来该做什么。是的,我没有创建索引但我想你已经知道你需要什么索引。
答案 2 :(得分:0)
通过将所有单词添加到给定字符串的过滤器,为每个字符串计算bloom过滤器。在任何新的字符串查找中,计算布隆过滤器,并在数据库中查找匹配的字符串。
你可能可以使用相当短的布隆过滤器,对你的字符串进行一些测试可以告诉你你需要多长时间。