【问题标题】:MySQL fulltext/regexp/levenshtein search optimizationMySQL 全文/regexp/levenshtein 搜索优化
【发布时间】: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] 正在搜索 search。这是你的意图吗?我认为WHERE `word` like '%search%' 就足够了(如果您想看看search 是否出现在列中)。
  • @chris85 这有点像本意,是的。 %search% 没有给我“搜索”的近似结果(如“s34rch”)——这使得整个练习变得毫无意义,因为这是拥有 levenshtein 函数的目的
  • @RobGudgeon 我开始研究狮身人面像搜索。看起来这就是我要找的东西,但我也不想因为需要更新两个数据库而在服务器上造成更多负载。
  • 保持 sphinx 索引最新的 cronjob 非常快,不会给您的服务器带来太多麻烦

标签: php mysql optimization full-text-search


【解决方案1】:

按照@RobGudgeon 的建议,我最终使用了sphinxsearch。虽然不是 MySQL(以及它自己的另一个数据库),但实际上从 MySQL 更新和在自己的数据库中搜索都非常快。推荐用于大型数据库的全文搜索,因为目前缺乏 MySQL 的原生支持。

【讨论】:

    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2019-05-16
    • 2011-09-24
    • 1970-01-01
    相关资源
    最近更新 更多