如何按相关性对MySQL搜索结果进行排序?

3

我有一个类似于这个问题所问的查询。

MySQL - 如何按相关性排序? INNODB表

不同之处在于,我想从5个字段中搜索:

add1,add2,add3,post_town和post_code

只有 post_code 字段中的记录不为空,其他字段中的记录可能在某些位置为空。 如果我搜索关键词 kingston ,它会返回:

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."%'

所以我需要搜索关键字出现在开头的记录排在最前面。我该怎么做?

3个回答

5
不是最美观的,但应该可以工作!
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;

非常感谢,这个完美地运行了。只是在最后一行做了一个修改,让它看起来更加智能。 按照 a.rank 升序排序,add1、add2、add3、post_town、post_code。 - aslamdoctor

1
为什么不使用查询选择最小的符合条件的结果,并在脚本中使用自己的逻辑给予高级排名权重并相应地对它们进行排序呢?
这将帮助您:
  1. 拥有更复杂的排名标准,这些标准可能无法在查询中实现。

  2. 如果您的排名标准发生变化,就不需要编辑 SQL 查询。


同意。我不禁觉得,这是最好在 SQL 查询之外解决的问题。 - Tom Mac

1

对于基于相关性的排序,全文搜索 是更可靠的选择。

全文搜索 基于搜索词出现的次数来确定相关性,这可以用于后续的结果排序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接