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

时间:2011-09-28 11:45:15

标签: mysql search relevance

我在这个问题上提出了类似的查询

MySQL - How to ORDER BY RELEVANCE? INNODB Table

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

add1,add2,add3,post_town,post_code

只有 post_code 字段中的记录才会为空,其他字段记录在某些地方可能为空。如果我搜索关键字金士顿,则返回

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

My Current 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 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

为什么不用查询选择最小的合格结果,并在脚本中使用自己的逻辑来为结果提供预先的排名权重并对其进行相应的排序?

这会帮助你:

  1. 在查询中包含更复杂的排名标准。

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

答案 2 :(得分:1)

对于基于相关性的排序,FULL TEXT SEARCH是更可靠的选项。

FULL TEXT SEARCH根据搜索词的出现次数使用了相关性,以后可以将其用于ORDER返回的结果。