MySQL全文搜索匹配类似的结果

时间:2014-09-21 10:10:31

标签: mysql search search-engine

我将尝试解释我的情况:我正在尝试在我的网站上为产品创建搜索引擎,因此当用户需要查找产品时,我需要显示相似的产品,这里&#39是一个例子。

用户搜索
assassins creedassassinscreedaSsAssIn's CreeD假设没有字母/数字拼写错误(这3个查询应产生相同的结果)

预期结果:
Assassin's CreedAssassin's Creed: UnityAssassin's Creed: Special Edition

到目前为止我尝试了什么

  • 我为搜索引擎创建了一个MySQL字段,其中包含产品的解析名称(Assassin's Creed: Unity -> assassinscreedunity
  • 我解析搜索查询
  • 我使用MySQL' s INSTR()
  • 进行搜索

我的问题

我使用它很好,但是当行数增加时我听说它可能很慢,我在表格中创建了一个全文索引,但我不认为这会有所帮助,所以我需要另一种解决方案 谢谢你的回答,并在向下投票之前问我任何事情。

1 个答案:

答案 0 :(得分:0)

首先,您应该更准确地跟踪查询中的效果问题,而不是“听说它很慢”。并且“认为这会有所帮助”。一个起点可能是Slow Query Log

如果您的表在多行中包含相同的已解析名称,请考虑normalizing您的数据库。在特定情况下,将唯一的解析名称存储在一个表中,并且只在您在问题中描述的表中存储相应解析名称的id。这样,您只需要检查具有唯一名称的较小表,然后可以通过id快速查找主表中的所有匹配条目。

示例:

请考虑下表及您的结构

 id | product_name        | rating
-----------------------------------
 1  | assassinscreedunity | 5
 2  | assassinscreedunity | 2
 3  | monkeyisland        | 3
 4  | monkeyisland        | 5
 5  | assassinscreedunity | 4
 6  | monkeyisland        | 4

您必须扫描所有六个条目才能找到相关的行。

相反,请考虑两个这样的表:

 id | p_id | rating
--------------------
 1  | 1    | 5
 2  | 1    | 2
 3  | 2    | 3
 4  | 2    | 5
 5  | 1    | 4
 6  | 2    | 4

 id | name
--------------------------
 1  | assassinscreedunity
 2  | monkeyisland

在这种情况下,您只需要扫描两个条目(与六个相比),然后可以使用整数id有效地查找相关行。

为了进一步增强性能,您可以扩展已解析名称的概念并使用哈希。例如,您可以计算解析名称的SHA1哈希值,该值是160位值。您可以非常有效地在数据库中找到此值的条目。要匹配子字符串,您也可以将它们添加到第二个表中。由于哈希只需要计算一次,您仍然可以使用数据库来匹配整数。另一件事可能是fuzzy hashing

此外,您应该通常阅读Rabin–Karp algorithmstring searching