我今天在使用mysqls MATCH()... AGAINST()时遇到了问题。

因为我想解决问题可能更容易,所以我创建了一个小SQLFiddle

我完全理解,在本“选择”陈述的工作方式中,为什么“ Foo Bar Foo”比“ Foo Bar”更相关。但是我想要的是“完全匹配”字词比“完全匹配且多一点”字词具有更高的相关性。

title         relevance
Foo Bar       0.046829063445329666
Foo Bar Foo   0.031219376251101494
Foo           0
Bar           0


如果不使用“联合”来组合两个语句,是否有可能得到该结果?

回答(感谢Gordon Linoff):

SELECT *
FROM FOOBAR
WHERE title LIKE '%Foo Bar%'
ORDER BY (CASE WHEN title LIKE 'Foo Bar%' THEN 1 ELSE 0 end) DESC,
         MATCH (title) AGAINST ('Foo Bar' IN BOOLEAN MODE) ASC

最佳答案

您可以在order by中进行所需的操作。一种方法是计算匹配的不同单词的数量,然后在每个组中按相关性升序排序:

SELECT fb.*,
       MATCH (title) AGAINST ('+Foo +Bar' IN BOOLEAN MODE) AS relevance
FROM FOOBAR fb
ORDER BY ((case when title like '%Foo%' then 1 else 0 end) +
          (case when title like '%Bar%' then 1 else 0 end)
         ) desc,
         relevance asc


这就是您想要的示例数据。通常,它可能无法正常工作,因为相关性计算除单词匹配的次数和字符串的长度以外,还有其他因素。

关于mysql - 在顶部用完整的数学命令mysql MATCH()AGAINST()相关性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46909786/

10-15 20:43