MySql全文搜索短词不正确

时间:2017-03-31 15:37:25

标签: mysql sql search

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

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

我使用此查询在大量包含音乐课程的页面内搜索。它工作得很好。页面根据它们与查询的匹配程度得分。

除非用户搜索类似" C Chord"或者" Am Chord"第一部分被忽略了。如果我搜索"和弦"或者" E和弦"这个名为" C chord"总是排在最前面。

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

然后是第2部分。是否可以给列#34;标题"然后对分数更重要"描述"?

2 个答案:

答案 0 :(得分:1)

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

短于最小值的单词未编入索引,因此您无法搜索它们。请记住在更改参数后重建索引。方便(哈!)他们有不同的默认值。

此外,还有停用单词列表以删除常用停用词。这是否是一个问题取决于您要搜索的单词。您可以自定义停用词。

答案 1 :(得分:0)

  1. 问题
  2. 这已经在SO上讨论了很多次:MySQL的内置全文解析器是为searching for words而设计的,不是针对单个字符,而是默认的最小字长设置为3({{ 3}})或4(innodb)这些设置意味着没有短于3或4个单词的单词被索引,因此全文搜索无法找到。您可以将最小字符长度限制降低到1并重建索引,但它会减慢搜索速度,因为索引会更大。

    1. 问题
    2. 可以,但您需要单独搜索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
      

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

相关问题