9

我有一个搜索表单,它搜索站点内容表以拉回适当的结果。

我想搜索标题和内容字段并按相关顺序拉回结果。给予标题最高优先级。

假设我们有一个表 (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

4 回答 4

21

我设法得到了很好的理解:

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
于 2013-02-22T14:33:48.000 回答
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;
于 2013-12-19T15:57:05.767 回答
3

可能有一种更有效的方法,并且考虑到搜索字符串可能超过 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
于 2013-02-22T14:23:49.107 回答
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
于 2013-02-22T14:23:37.460 回答