MySQL按相关性排序

时间:2013-02-22 14:19:52

标签: mysql sql-order-by

我有一个搜索表单,用于搜索网站内容表以取回适当的结果。

我想搜索标题和内容字段,并按相关性顺序拉回结果。优先考虑标题。

假设我们有一个表(tblContent)

intID | strTitle    | txtContent

1     | Smith John  | Lorem Ipsum
2     | Lorem Ipsum | Lorem John Smith Ipsum
3     | John Smith  | Lorem Ipsum Lorem Ipsum
4     | Lorem Ipsum | Lorem Ipsum Lorem Ipsum
5     | Lorem Ipsum | Lorem Ipsum Smith John

你正在寻找“John Smith”,结果应该以3,2,1,5

的顺序返回

这怎么可能?

4 个答案:

答案 0 :(得分:18)

我设法得到了很好的信息:

SELECT *, 
( (1.3 * (MATCH(strTitle) AGAINST ('+john+smith' IN BOOLEAN MODE))) + (0.6 * (MATCH(txtContent) AGAINST ('+john+smith' IN BOOLEAN MODE)))) AS relevance 
FROM content 
WHERE (MATCH(strTitle,txtContent) AGAINST ('+john+smith' IN BOOLEAN MODE) ) 
ORDER BY relevance DESC

答案 1 :(得分:4)

可能有一种更有效的方法,并且鉴于搜索字符串可能超过2个字,这可能是不可行的,但我会做类似的事情

ORDER BY CASE 
 WHEN strTitle LIKE '%John Smith%' THEN 1
 WHEN txtContent LIKE '%John Smith%' THEN 2
 WHEN strTitle LIKE '%Smith John%' THEN 3
 WHEN txtContent LIKE '%Smith John%' THEN 4
ELSE 5 END

答案 2 :(得分:4)

mysql全文搜索是一件好事,但它有至少4个字符的限制要被索引的字。可以更改限制,但在所有情况下都无法更改服务器变量。    在这种情况下,我建议按案例

按顺序建议解决方案
select 
    *
from
mytable a
WHERE
    (a.title like 'somthing%'
    OR a.title like '%somthing%'
    OR a.title like 'somthing%')
ORDER BY case
WHEN a.title LIKE 'somthing%' THEN 1
WHEN a.title LIKE '%somthing%' THEN 2
WHEN a.title LIKE '%somthing' THEN 3
ELSE 4 END;

答案 3 :(得分:0)

的内容如何?
SELECT INT(id), strTitle, txtContent
FROM tblContent
WHERE name like '%John%'
GROUP BY strTitle
ORDER BY CASE WHEN strTitle like 'John %' THEN 0
           WHEN strTitle like 'John%' THEN 1
           WHEN strTitle like '% John%' THEN 2
           ELSE 3
      END, strTitle