我将尝试解释我的情况:我正在尝试在我的网站上为产品创建搜索引擎,因此当用户需要查找产品时,我需要显示相似的产品,这里&#39是一个例子。
用户搜索
assassins creed
或assassinscreed
或aSsAssIn's CreeD
假设没有字母/数字拼写错误(这3个查询应产生相同的结果)
预期结果:
Assassin's Creed
和Assassin's Creed: Unity
和Assassin's Creed: Special Edition
Assassin's Creed: Unity -> assassinscreedunity
INSTR()
我使用它很好,但是当行数增加时我听说它可能很慢,我在表格中创建了一个全文索引,但我不认为这会有所帮助,所以我需要另一种解决方案 谢谢你的回答,并在向下投票之前问我任何事情。
答案 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 algorithm或string searching。