一开始是产品提的需求,从来没用过模糊查询,还能带上匹配程度的。这个就像字符串匹配,应该不存在匹配度这个说法,因为匹配度如何定义也是一件复杂的事情,比如词语的同义等。但是用mysql来实现“伪匹配度”还是可行的。下边总结了几种思路:
一、根据关键字出现的位置,给出不同的权重
? ? ?比如只包含关键字的,权重最高。但是缺点也很明显,太粗糙。
SELECT *
FROM demo
WHERE c LIKE '%人民日报%'
ORDER BY
?CASE
???WHEN c LIKE '人民日报' THEN 0
???WHEN c LIKE '人民日报%' THEN 1
???WHEN c LIKE '%人民日报' THEN 3
???ELSE 2
? END
二、看长度
? ? ? ?其实也很好理解,长度越短,说明里面匹配的字符越多
SELECT * FROM demo
WHERE c LIKE '%人民日报%'
ORDER BY length(c)
LIMIT 10
但是不能避免出现多个关键字的情况,可以通过比例(剩余长度/长度),越小说明占比越大,匹配度越高:
SELECT *
FROM demo
WHERE c LIKE '%人民日报%'
ORDER BY length(REPLACE(c,'人民日报',''))/length(c)
LIMIT 10