如何按相关性对mysql搜索结果排序?
在这个问题上,我有一个类似的疑问 区别在于,这里我想从5个字段中搜索 地址1、地址2、地址3、邮政镇、邮政编码 并且只有post_code字段中的记录不会为空,其他字段记录在某些地方可能为空。如果我搜索关键字kingston,它会返回如何按相关性对mysql搜索结果排序?,mysql,search,relevance,Mysql,Search,Relevance,在这个问题上,我有一个类似的疑问 区别在于,这里我想从5个字段中搜索 地址1、地址2、地址3、邮政镇、邮政编码 并且只有post_code字段中的记录不会为空,其他字段记录在某些地方可能为空。如果我搜索关键字kingston,它会返回 Acre Road, Kingston upon Thames, KT2 6EA Kingston Road, Epsom, KT19 0DG Kingston Road, Epsom, KT20 0DH 这些结果是所有字段的组合add1、add2、add
Acre Road, Kingston upon Thames, KT2 6EA
Kingston Road, Epsom, KT19 0DG
Kingston Road, Epsom, KT20 0DH
这些结果是所有字段的组合add1、add2、add3、post_town、post_code
我需要这个结果按以下顺序
Kingston Road, Epsom, KT19 0DG
Kingston Road, Epsom, KT20 0DH
Acre Road, Kingston upon Thames, KT2 6EA
我当前的SQL查询是这样的
SELECT add1, add2, add3, post_town, post_code FROM address_mst
WHERE add1 LIKE '%".$keyword."%'
OR add2 LIKE '%".$keyword."%'
OR add3 LIKE '%".$keyword."%'
OR post_town LIKE '%".$keyword."%'
OR post_code LIKE '%".$keyword."%'
因此,我需要搜索关键字在开头的记录,而搜索关键字在第一位。我该怎么做呢?不是最漂亮的,但应该有用
select a.* from (
SELECT add1, add2, add3, post_town, post_code, 1 as rank FROM address_mst
WHERE add1 LIKE '%".$keyword."%'
UNION
SELECT add1, add2, add3, post_town, post_code, 2 as rank FROM address_mst
WHERE add2 LIKE '%".$keyword."%'
UNION
SELECT add1, add2, add3, post_town, post_code, 3 as rank FROM address_mst
WHERE add3 LIKE '%".$keyword."%'
UNION
SELECT add1, add2, add3, post_town, post_code, 4 as rank FROM address_mst
WHERE post_town LIKE '%".$keyword."%'
UNION
SELECT add1, add2, add3, post_town, post_code, 5 as rank FROM address_mst
WHERE post_code LIKE '%".$keyword."%'
) a
order by a.rank asc;
为什么不通过查询选择最小的符合条件的结果,并在脚本中使用自己的逻辑为结果赋予高级排名权重,并相应地对其进行排序 这将有助于你:
对于基于相关性的排序,是更可靠的选择
全文搜索
使用了基于搜索词出现次数的相关性,该搜索词稍后可用于排序返回的结果。同意。我忍不住觉得这是一个最好的解决办法,而不是SQL查询。非常感谢,这非常有效。只是在最后一行做了一个修改,让它看起来更聪明,顺序是a.rank asc,add1,add2,add3,post_town,post_code;