Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何按相关性对mysql搜索结果排序?_Mysql_Search_Relevance - Fatal编程技术网

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

如何按相关性对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

在这个问题上,我有一个类似的疑问

区别在于,这里我想从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、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查询


  • 对于基于相关性的排序,是更可靠的选择


    全文搜索
    使用了基于搜索词出现次数的相关性,该搜索词稍后可用于排序返回的结果。

    同意。我忍不住觉得这是一个最好的解决办法,而不是SQL查询。非常感谢,这非常有效。只是在最后一行做了一个修改,让它看起来更聪明,顺序是a.rank asc,add1,add2,add3,post_town,post_code;