【发布时间】:2015-09-01 00:55:58
【问题描述】:
我有一个包含 100 多万条记录(并且还在快速增长)的数据库,我想实现一个按最接近的结果排序的搜索功能。
我做了一些研究,发现全文搜索只是前缀,这不是我真正想要的。
我得到的结果足够接近,可以称之为好,但问题是查询非常慢。
levenshtein 函数来自这里:http://www.artfulsoftware.com/infotree/qrytip.php?id=552
这是查询:
SELECT `id`,
`word`,
MATCH (`word`) AGAINST ('+*search*') IN BOOLEAN MODE) AS `match`
FROM `words`
WHERE `word` REGEXP '^.*[search].*$'
AND levenshtein(`word`, 'search') <= 2
ORDER BY levenshtein(`word`, 'search'), `match` ASC
LIMIT 10;
因此,总体而言,结果非常接近,但实际完成搜索需要几分钟,这真的不是我想要的,因为每次按下一个键我都会发送一个 jquery AJAX 请求。
任何帮助将不胜感激。
【问题讨论】:
-
我过去使用过sphinxsearch.com 非常成功(诚然不是用于100m+ 的记录,但它足够快,我认为它不会给您带来问题)。您可以调整不同组件的权重,以确保获得“正确”的结果
-
[search]正在搜索s、e、a、r、c或h。这是你的意图吗?我认为WHERE `word` like '%search%'就足够了(如果您想看看search是否出现在列中)。 -
@chris85 这有点像本意,是的。 %search% 没有给我“搜索”的近似结果(如“s34rch”)——这使得整个练习变得毫无意义,因为这是拥有 levenshtein 函数的目的
-
@RobGudgeon 我开始研究狮身人面像搜索。看起来这就是我要找的东西,但我也不想因为需要更新两个数据库而在服务器上造成更多负载。
-
保持 sphinx 索引最新的 cronjob 非常快,不会给您的服务器带来太多麻烦
标签: php mysql optimization full-text-search