MySql全文搜索不正确,不能使用短单词

doinxwow  于 2022-10-31  发布在  Mysql
关注(0)|答案(2)|浏览(172)

经过多次尝试和多次搜索,我来到下面的查询:

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

我用这个查询来搜索大量包含音乐课程的页面。它工作得很好。页面根据它们与查询的匹配程度得到一个分数。
除了当用户搜索类似“C和弦”或“Am和弦”的东西时,第一部分被忽略。如果我搜索“A和弦”或“E和弦”,名为“C和弦”的页面总是在顶部。
所以...我的第一个问题是:我该怎么补救呢?
然后是第2部分。是否有可能给予“标题”列比“描述”列更大的分数重要性?

olhwl3o2

olhwl3o21#

1.问题
这一点已在SO上讨论过很多次:MySQL的内置全文解析器是为searching for words而设计的,而不是为单个字符设计的,并且默认的最小字长设置为3(无)或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

您需要调整全文索引,以便能够执行单独的搜索。

fquxozlt

fquxozlt2#

MySQL有两个重要的全文搜索参数,停止词和最小字长。第一个是最小字长(文档here):

  • 初始数据库:innodb_ft_min_token_size(默认值为3)
  • 我的Isam:ft_min_word_len(默认值为4)

比最小值短的单词不会被索引,所以你不能搜索它们。记住在改变参数后重建索引。方便的是(哈!)它们有不同的默认值。
此外,还有停用字词清单可移除常见的停用字词。这是否会造成问题,取决于您要搜寻的字词。您可以自订停用字词。

相关问题