【问题标题】:MySQL fulltext with score by columnsMySQL全文按列得分
【发布时间】:2021-04-17 20:16:03
【问题描述】:

我创建了一个这样的索引:

ALTER TABLE `blog_posts`
ADD FULLTEXT `title_description_content` (`title`, `description`, `content`);

我可以搜索:

SELECT * FROM `blog_posts`
WHERE MATCH(title, content, description)
AGAINST("lorem ipsum" IN NATURAL LANGUAGE MODE)
LIMIT 12

但我想按列得分。比如标题栏3分,描述2分,内容1分。这样在标题中找到的词得分更高。

我知道这是可能的,因为我已经做过一次,但是我丢失了源代码,并且在 Google 上找不到任何示例。

谢谢!

【问题讨论】:

    标签: mysql mariadb full-text-search match-against


    【解决方案1】:

    您可以针对您的问题使用多个索引

    SELECT *,
      MATCH (title) AGAINST ("lorem ipsum" IN NATURAL LANGUAGE MODE) AS rel1,
      MATCH (content) AGAINST ("lorem ipsum" IN NATURAL LANGUAGE MODE) AS rel2,
      MATCH (description) AGAINST ("lorem ipsum" IN NATURAL LANGUAGE MODE) AS rel3
    FROM `blog_posts`
    WHERE MATCH(title, content, description) AGAINST("lorem ipsum" IN NATURAL LANGUAGE MODE)
    ORDER BY (rel1 * 3)+(rel2 * 2)+(rel3 * 1) DESC
    LIMIT 12
    

    权重乘法可以微调

    【讨论】:

    • 我认为这将需要 4 个 FULLTEXT 索引 - 每列一个,加上 3 个列的组合一个。 (至少在 InnoDB 中。)
    • @RickJames 是正确的,可以跳过 where 子句中的第四个,因为 res1+res2+res3 大于 0,但这可能不会给出想要的结果。
    猜你喜欢
    • 2012-04-08
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    相关资源
    最近更新 更多