我有以下查询:
SELECT * FROM table_name
WHERE (col_1 LIKE '%$keyword%'
OR col_2 LIKE '%$keyword%'
OR col_3 LIKE '%$keyword%')
AND .... <some optional filters> ...
是否有基于最相关结果进行排序的策略?
答案 0 :(得分:31)
如果你的意思是col_1比col_2更相关,那么:
select *
,case when col_1 like '%$keyword%' then 1
when col_2 like '%$keyword%' then 2
when col_3 like '%$keyword%' then 3
end as [priority]
from table_name
where col_1 like '%$keyword%'
or col_2 like '%$keyword%'
or col_3 like '%$keyword%'
order by [priority]
如果你的意思是列匹配最多,那么:
select *
,(case when col_1 like '%$keyword%' then 1 else 0 end) +
,(case when col_2 like '%$keyword%' then 1 else 0 end) +
,(case when col_3 like '%$keyword%' then 1 else 0 end) as [priority]
from table_name
where col_1 like '%$keyword%'
or col_2 like '%$keyword%'
or col_3 like '%$keyword%'
order by [priority] desc
答案 1 :(得分:29)
当你谈到“相关性”时,你真的想要MySQL full-text searches支持的自然语言搜索。语法与普通类查询不同,您需要向表中添加一个特殊索引,但可以通过相关性进行排序。
以下是MySQL如何计算相关性(来自链接):
当在WHERE子句中使用MATCH()时,如前面所示的示例,返回的行将首先自动排序,具有最高的相关性。相关性值是非负浮点数。零相关意味着没有相似性。相关性的计算基于行中的单词数,该行中唯一单词的数量,集合中单词的总数以及包含特定单词的文档(行)数。
要create a full-text index on an existing table,请使用 FULLTEXT 修饰符:
CREATE FULLTEXT INDEX index_name
ON table_name (col1, col2, col3)
然后,您可以执行这样的查询,以按相关性顺序检索结果:
SELECT * FROM table_name
WHERE MATCH (col1,col2,col3)
AGAINST ('keyword' IN NATURAL LANGUAGE MODE);
答案 2 :(得分:3)
你做不到。您要求您的RDBMS按行排序结果,其中“LIKE”列最匹配降序。
例如,MySQL使用所谓的FULLTEXT索引来做这件事。