位置无关的字符串匹配

时间:2013-10-08 03:49:23

标签: mysql solr sphinx string-matching

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

字符串匹配的定义

对于我的情况,文本中单词的位置无关紧要。只有所有单词都应该出现在字符串中,并且两个字符串中都没有多余的单词。

前 - 拉姆是一个男孩男孩是拉姆将被称为匹配。 Ram是一个好孩子不会匹配。

PS - 请忽略感觉

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

解决方案我能想到:

  1. 索引SOLR / Sphinx中的所有字符串
  2. 在新搜索中,我会 点击搜索服务器,必须考虑最多10个字符串
  3. 优点: -

    1. 比mysql全文搜索更快
    2. 缺点: -

      1. 使用mysql中的新查询更新搜索服务器 数据库中。
      2. 我还有其他更好的解决方案吗?任何建议和解决方法都非常受欢迎:)

        谢谢!

3 个答案:

答案 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上的另一篇文章中查看我针对类似要求提出的架​​构建议。

accommodate fuzzy matching

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

EDIT-1

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

enter image description here

enter image description here

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

答案 2 :(得分:0)

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

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