经过多次尝试和多次搜索,我遇到了以下查询:
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部分。是否有可能使“标题”列对得分的重要性大于对“描述”的重要性?
在SO上已经讨论了很多次了:MySQL的内置全文分析器旨在搜索单词,而不是单个字符,并且默认的最小单词长度设置为3(innodb)或4(myisam)。这些设置意味着短于3或4个单词的单词不会被索引,因此无法通过全文搜索找到。您可以将最小字符长度限制降低到1并重建索引,但是由于索引会更大,因此它将减慢搜索速度。
可以,但是您需要title单独在该字段中进行搜索,并提高该字段的相关性得分结果title。
title
您可以使用union来获得组合列表,sum()以对任何记录的分数求和:
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
您需要调整全文索引才能进行单独的搜索。