Mysql按相关性和标题排序

Mysql order by relevance and title

提问人:rahul anand 提问时间:5/27/2022 最后编辑:forpasrahul anand 更新时间:5/31/2022 访问量:309

问:

我有一个搜索功能的 sql 查询,它有点复杂,但它效果很好。

SELECT
    SQL_CALC_FOUND_ROWS p.id as id,
    p.title as title,
    co.title as company,
    p.price as price,
    p.image_url as image_url FROM products p 
JOIN product_categories pc ON p.id = pc.product_id
JOIN categories cat ON pc.category_id = cat.id
JOIN companies co ON p.company_id = co.id

        WHERE MATCH(p.title) AGAINST("nalle" IN BOOLEAN MODE)
        OR MATCH(p.description) AGAINST("nalle" IN BOOLEAN MODE)
        OR MATCH(cat.title) AGAINST("nalle" IN BOOLEAN MODE)
        OR MATCH(co.title) AGAINST("nalle" IN BOOLEAN MODE)

    GROUP BY p.id
    ORDER BY p.title
    LIMIT :offset, :limit

现在,它是按产品标题排序的,但它应该把最相关的结果放在第一位。这意味着,如果它同时匹配 p.title 和 p.description,则比仅匹配 p.title 更相关。最好的匹配是匹配所有四个。

由于查询的复杂性,我不知道如何计算它。

mysql 匹配 sql-order-by

评论


答:

0赞 forpas 5/27/2022 #1

4 个函数中的每一个都返回一个布尔值,其计算结果为 1 或 0,因此您可以获取所有返回值的总和并按该降序排序:MATCH()

ORDER BY MATCH(p.title) AGAINST("nalle" IN BOOLEAN MODE) + 
         MATCH(p.description) AGAINST("nalle" IN BOOLEAN MODE) +
         MATCH(cat.title) AGAINST("nalle" IN BOOLEAN MODE) +
         MATCH(co.title) AGAINST("nalle" IN BOOLEAN MODE) DESC

评论

0赞 Luuk 5/27/2022
MATCH()将返回一个浮点数(使用 Innodb 时),参见:stackoverflow.com/a/42820904/724039(这个答案的结果还是可以的!
0赞 Asgar 5/27/2022 #2

使用相关性分数怎么样。我找到了一个这样的例子:

SELECT table. * ,
MATCH (
col1, col2, col3
)
AGAINST (
'+(Term1) +(Term1)'
) AS Score
FROM table
WHERE MATCH (
col1, col2, col3
) 
AGAINST (
'+(Term1) +(Term1)'
)

我相信你可以弄清楚剩下的