25

我有以下查询:

SELECT * FROM table_name
WHERE (col_1 LIKE '%$keyword%'
    OR col_2 LIKE '%$keyword%'
    OR col_3 LIKE '%$keyword%')
  AND .... <some optional filters> ... 

是否有基于最相关结果进行排序的策略?

4

3 回答 3

39

如果您的意思是 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
于 2012-06-21T18:33:11.930 回答
37

当你谈到“相关性”时,你真的想要自然语言搜索,这是 MySQL全文搜索所支持的。语法与普通查询不同您需要向表中添加特殊索引,但这种方式可以按相关性排序。

以下是 MySQL 计算相关性的方式(来自链接):

在 WHERE 子句中使用 MATCH() 时,如前面的示例所示,返回的行会自动按照相关性最高的顺序进行排序。相关性值是非负浮点数。零相关性意味着没有相似性。相关性是根据行中的单词数、该行中唯一单词的数量、集合中的单词总数以及包含特定单词的文档(行)数来计算的。

在现有表上创建全文索引,请使用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);
于 2012-06-21T18:34:46.407 回答
3

你不能。您要求您的 RDBMS 按“LIKE”列匹配最多的行对结果进行降序排序。

例如,MySQL 使用所谓的FULLTEXT索引来执行此操作。

于 2012-06-21T18:32:48.520 回答