【发布时间】:2011-10-11 20:53:07
【问题描述】:
总和
我有两列,name 和 name_searchable。我想在这些列(有数百万行)中搜索并根据它们的匹配率返回结果。我有两个重要的标准;搜索应该是高效和快速的。我怎样才能做到这一点?
详细介绍
我打算创建一个包含数百万行的表。所以基本上,我创建了一个转储表来测试一百万行的查询。该表使用MyISAM 存储引擎,它的索引和主键是id 号。我要进行的搜索与名称字段有关,该字段是varchar 列。现在,基于查询,我想返回与查询部分或全部匹配的所有结果。因此,当用户搜索“björn borg”时,我想同时返回:
- 比约恩博格
- 比约恩博格斯
- bjorn borg(注意 o)
等等……
这里的重要因素是= 运算符应始终返回比LIKE 运算符更高的排名。因此,'björn borg' 应该总是出现在 'bjorn borgus' 之前。
最近,我问了关于如何在变音符号不敏感模式下返回结果的问题,但不幸的是我无法让它工作。因此,我沿名称列创建了另一列,该列仅以英文字符存储名称。所以我们有name 和name_searchable 字段。
好吧,我用存储过程尝试了整个过程,但与普通查询相比,它显然真的很慢。因此,我想知道我是否可以根据它们匹配的 where 子句对结果进行排序。换句话说:
SELECT * FROM myUsers WHERE name = 'björn borg' OR name_searchable = 'bjorn borg' OR name LIKE '%björn borg%' OR name_searchable LIKE '%bjorn borg%';
所以基本上,这个想法是给每个条件不同的分数。我的意思是,虽然 name = 'björn borg' 应该有排名,比如 5,name_searchable LIKE '%bjorn borg%' 应该有 2 (第二个 4 分,第三个 3 分......)我怎么能使用 MySql 完成这项工作? (效率和速度对我来说很重要)
【问题讨论】:
-
您可能最好运行多个独立查询,而不是尝试在一个中执行此操作。 where 子句不是进行此类计算的好地方。
标签: mysql performance search