【问题标题】:Order mysqls MATCH() AGAINST() relevancy with full math at the top订购 mysql MATCH() AGAINST() 相关性,顶部有完整的数学
【发布时间】:2017-10-24 11:47:57
【问题描述】:

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

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

我完全理解,为什么“Foo Bar Foo”在此 Select 语句的工作方式上比“Foo Bar”更相关。但我想要的是“完全匹配”术语的相关性高于“完全匹配和更多”术语。

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

如果不使用“union”来组合两个语句,是否可以得到这个结果?

答案(感谢 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

【问题讨论】:

    标签: mysql match match-against against


    【解决方案1】:

    您可以在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
    

    这可以满足您对示例数据的要求。一般情况下它可能不起作用,因为相关性计算除了单词匹配的次数和字符串的长度之外还有其他因素。

    【讨论】:

    • 这就是我想要的!谢谢!我将用我的 - 稍微修改过的版本更新我的 startpost。 :)
    猜你喜欢
    • 2011-09-09
    • 1970-01-01
    • 2016-11-01
    • 2012-05-22
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 2011-11-10
    相关资源
    最近更新 更多