小编典典

MySql全文搜索不正确的短词

sql

经过多次尝试和多次搜索,我遇到了以下查询:

SELECT id,
       title,
       description,
       MATCH(title,description,tags) AGAINST ('$search' IN NATURAL LANGUAGE MODE) AS score
FROM pages

我使用此查询在包含音乐课程的大量页面中进行搜索。它相当不错。页面根据与查询的匹配程度获得得分。

除非用户搜索“ C Chord”或“ Am Chord”之类的内容,否则第一部分将被忽略。如果我搜索“ A和弦”或“ E和弦”,则称为“
C和弦”的页面始终位于顶部。

所以..我的问题的第1部分是:我该如何解决?

然后是第2部分。是否有可能使“标题”列对得分的重要性大于对“描述”的重要性?


阅读 224

收藏
2021-04-14

共1个答案

小编典典

  1. 问题

在SO上已经讨论了很多次了:MySQL的内置全文分析器旨在搜索单词,而不是单个字符,并且默认的最小单词长度设置为3(innodb)或4(myisam)。这些设置意味着短于3或4个单词的单词不会被索引,因此无法通过全文搜索找到。您可以将最小字符长度限制降低到1并重建索引,但是由于索引会更大,因此它将减慢搜索速度。

  1. 问题

可以,但是您需要title单独在该字段中进行搜索,并提高该字段的相关性得分结果title

您可以使用union来获得组合列表,sum()以对任何记录的分数求和:

SELECT p.id, any_value(title), any_value(description), any_value(tags), sum(t.score) as sum_score
FROM
    (SELECT id, (MATCH(title) AGAINST ('$search' IN NATURAL LANGUAGE MODE)) *2 AS score
     FROM pages
     UNION ALL
     SELECT id, MATCH(description,tags) AGAINST ('$search' IN NATURAL LANGUAGE MODE) AS score
     FROM pages) t
INNER JOIN pages p on t.id=p.id
GROUP BY p.id
ORDER BY sum(t.score) DESC

您需要调整全文索引才能进行单独的搜索。

2021-04-14