我有一个搜索表单,用于搜索网站内容表以取回适当的结果。
我想搜索标题和内容字段,并按相关性顺序拉回结果。优先考虑标题。
假设我们有一个表(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
的顺序返回这怎么可能?
答案 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