Mysql 按相关性排序

Mysql 按相关性排序,mysql,sql-order-by,Mysql,Sql Order By,我有一个搜索表单,它搜索一个站点内容表以提取适当的结果 我想搜索标题和内容字段,并按相关性顺序提取结果。给予头衔最高优先权 假设我们有一张 你在搜索“John Smith”结果应该按3,2,1,5的顺序返回 这是怎么可能的?关于 SELECT INT(id), strTitle, txtContent FROM tblContent WHERE name like '%John%' GROUP BY strTitle ORDER BY CASE WHEN strTitle like 'John

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

我想搜索标题和内容字段,并按相关性顺序提取结果。给予头衔最高优先权

假设我们有一张

你在搜索“John Smith”结果应该按3,2,1,5的顺序返回


这是怎么可能的?

关于

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

可能有一种更有效的方法,如果搜索字符串可能超过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

我成功地做到了这一点:

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

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;

桌子有多大?目前大约有150行。这是一个相当小的网站,所以永远不会接近1k Rowsee,也许它会有帮助:这是对多索引相关性解决方案的一个很好的解释,我喜欢这个想法,但正如你提到的,搜索可能是一个无限数量的词,因为它来自搜索input@Fraser你不应该给用户无限的机会。无论如何,我看不出查询contatenate有问题:)(您可以使用动态占位符、动态清理用户数据和动态连接查询:)问题是,搜索标准来自用户填充的搜索输入,因此正确的解决方案需要能够处理用户向其抛出的任何东西。如果用户使用1.3和。6,则某些东西比其他东西更重。数字是他的首选此方法很棒,但会生成具有相同精确相关性分数的结果的非确定性排序。要解决这个问题,请添加更多的按列排序。我已经检查过了,使用此方法,查询时间为0.094秒,而使用下面的case方法,查询时间为0.063秒,使用case方法,结果的准确性更好。我不知道此查询中发生了什么。有人能在里面添加文档吗?@FaizanAnwerAliRupani它使用的是全文索引。您必须首先创建索引,然后才能使用匹配运算符。MySQL中的一个奇怪之处是,除非在SELECT语句中包含匹配列,否则无法按该列排序。比如,一旦你扩展,运营商的速度就慢得令人难以置信。MyISAM表的默认设置是至少4个字符。InnoDB的默认值为3个字符,但在任何情况下,您都可以更改配置以允许使用2个字符的单词:
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;