70

MySQL对Like搜索结果按照匹配程度排序

 6 years ago
source link: https://blog.yourtion.com/mysql-like-search-ordering.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

MySQL对Like搜索结果按照匹配程度排序

Yourtion 创作于:2018-01-09     全文约 653 字, 预计阅读时间为 2 分钟

最近项目上遇到一个需求,在原来项目的管理后台上,有一个通过用户昵称进行模糊搜索的功能,但是用户反映说有时候搜索关键字的结果比较多的话,准确匹配的结果没有排在前面。

检查了一下后端的代码,发现 like 的语句是 LIKE %keyword% ,然后排序的就是按照默认的方式,结果如下:

mysql-like-1.jpg

可以发现确实完整匹配 “阳光” 关键字的结果是分散的,找了一下解决方案,结果在 stackoverflow 找到这样的一个答案:MySQL order by “best match”,里面提出了几个解决方案,经过测试,在其中一个的基础上做了一些修改,得到比较好的结果。

更新后的 SQL 如下:

SELECT nickname
FROM customer
WHERE nickname LIKE '%阳光%'
ORDER BY
  CASE
    WHEN nickname LIKE '阳光' THEN 0
    WHEN nickname LIKE '阳光%' THEN 1
    WHEN nickname LIKE '%阳光' THEN 3
    ELSE 2
  END

结果如下:

mysql-like-2.jpg

使用 ORDER BY 并通过 CASE 进行判断,来返回排序结果,这样的方法从性能上可能存在问题,但是本身通过 %keyword% 查找就没有办法使用索引,而且管理后台的查询量就相对较少,通过上述方法可以很好的解决问题,最重要的是知道了 MySQL 上 ORDER 语句的一个新特性。

原文链接:https://blog.yourtion.com/mysql-like-search-ordering.html


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK