首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL按相关性排序

MySQL按相关性排序
EN

Stack Overflow用户
提问于 2013-02-22 22:19:52
回答 4查看 15K关注 0票数 9

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

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

假设我们有一张表(tblContent),

代码语言:javascript
运行
复制
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

这怎麽可能?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-22 22:33:48

我设法做到了这一点:

代码语言:javascript
运行
复制
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
票数 21
EN

Stack Overflow用户

发布于 2013-12-19 23:57:06

mysql全文搜索是一件好事,但它有一个最少4个字符的词被索引的限制。虽然限制是可以改变的,但是改变服务器变量并不是在所有情况下都是可能的。在这种情况下,我推荐按情况顺序建议的解决方案。

代码语言:javascript
运行
复制
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;
票数 4
EN

Stack Overflow用户

发布于 2013-02-22 22:23:49

可能有一种更有效的方法,考虑到搜索字符串可能超过2个单词,这可能是不可行的,但我会这样做

代码语言:javascript
运行
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15026244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档