开发者

How to sort mysql search result by relevance?

I have a similar query as asked on this question

MySQL - How to ORDER BY RELEVANCE? INNODB Table

Difference is, here I want to search from 5 fields as

add1, add2, add3, post_town, post_code

And only records in post_code field will be NOT EMPTY, other fields records may be empty at some places. If I search for keyword kingston, it returns

Acre Road, Kingston upon Thames, KT2 6EA

Kingston Road开发者_Python百科, Epsom, KT19 0DG

Kingston Road, Epsom, KT20 0DH

and these results are combination of all fields add1, add2, add3, post_town, post_code

I need this result in following order

Kingston Road, Epsom, KT19 0DG

Kingston Road, Epsom, KT20 0DH

Acre Road, Kingston upon Thames, KT2 6EA

My Current SQL query is like this

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

So I need records with search Keyword coming in the beginning would come first. How can I do that ?


Not the prettiest but should work!

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;


For relevancy based sorting, FULL TEXT SEARCH is the more reliable option.

FULL TEXT SEARCH used relevancy based on the number of occurrences of the searched term which could be later on used to ORDER results returned.


Why not select the minimal qualifying results with query, and use own logic in the script to give advance ranking weightage to your result and sort them accordingly ?

That would help you to :

  1. Have more complex ranking criteria which may or may not be possible in the query.

  2. Not editing the sql query if your ranking criteria changes.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜