【问题标题】:MySQL MATCH AGAINST on Two Tables Not Sorting by RelevanceMySQL MATCH AGAINST 在两个未按相关性排序的表上
【发布时间】:2021-07-31 21:17:02
【问题描述】:

我有一个使用 MATCH AGAINST 的存储过程,它最初返回按相关性排序的数据,这正是我想要的。但是,当我添加一个LEFT JOIN 和第二个MATCH AGAINST 时,它现在从两者返回数据,但不再按相关性排序。它现在自动按 ID 排序。

从一个按相关性排序的表返回

BEGIN
    SELECT
        dictionary.id,
        dictionary.`term`,
        dictionary.`definition`
    FROM itDictionary dictionary
    WHERE MATCH(dictionary.term, dictionary.definition)
    AGAINST(_query IN NATURAL LANGUAGE MODE);
END

从两个表返回,但以某种方式按 ID 排序

BEGIN
    SELECT
        dictionary.id,
        dictionary.`term`,
        dictionary.`definition`,
        links.id,
        links.`name`,
        links.`url`
    FROM itDictionary dictionary
        LEFT JOIN itRelatedLinks links ON links.term_id = dictionary.id
    WHERE MATCH(dictionary.term, dictionary.definition)
    AGAINST(_query IN NATURAL LANGUAGE MODE)
        OR MATCH(links.name)
    AGAINST(_query IN NATURAL LANGUAGE MODE);
END

我接近了吗?

【问题讨论】:

    标签: mysql match match-against against


    【解决方案1】:

    你可以这样做

    SELECT
        dictionary.id,
        dictionary.`term`,
        dictionary.`definition`,
        links.id,
        links.`name`,
        links.`url`
    FROM itDictionary dictionary
        LEFT JOIN itRelatedLinks links ON links.term_id = dictionary.id
    WHERE MATCH(dictionary.term, dictionary.definition)
    AGAINST(_query IN NATURAL LANGUAGE MODE)
        OR MATCH(links.name)
    AGAINST(_query IN NATURAL LANGUAGE MODE)
    ORDER BY MATCH(dictionary.term, dictionary.definition)
    AGAINST(_query IN NATURAL LANGUAGE MODE)
        + MATCH(links.name)
    AGAINST(_query IN NATURAL LANGUAGE MODE);
    

    它会将两者的分数相加,并有一个组合分数来排序

    当然,您可以为每个分数添加一个因素来确定优先级

    【讨论】:

    • 嘿@nbk 谢谢!我觉得这让我到了那里。我只需要按降序进行最终排序,以使列表顶部的搜索字符串数最多。我不知道这是否可能,但假设我搜索两个词“帐户网络”。它目前正在对匹配“帐户”的所有行进行排序,并在对所有匹配“网络”的行进行排序之前列出所有这些行,然后在最后添加任何具有与“帐户”或“网络”匹配的链接的行。结果的顶部是 id 42,在 term 和 def 之间有 4 次“account”,从那里逐渐变细,然后移动到“network”例如
    猜你喜欢
    • 2011-09-09
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多