Mysql全文搜索索引 - Match()/ Against()为不同的结果提供相同的优先级

时间:2015-10-18 18:21:24

标签: mysql

我使用全文索引来识别类似的列内容。 我注意到比赛得分并不像我期待的那样。

在我的表格中,我存储了电子游戏的名称。当我在搜索生化危机5"时,所有生化危机游戏都会得到相同的分数。

select id, name, 
    MATCH(name) AGAINST('Resident Evil 5' IN BOOLEAN MODE) AS score 
FROM game 
ORDER BY score DESC 

输出:

7   Resident Evil Revelations 2     1.7317759990692139
36  Resident Evil Remastered    1.7317759990692139
39  Resident Evil 5     1.7317759990692139
2   The Evil Within     0.7758325934410095

在我的情况下,生化危机5应该得分最高,但它只会为所有包含“生化危机”字样的游戏设置相同的分数。有没有办法改善得分?我不想从列表中排除其他生化危机游戏,但要给生化危机5提供更高的分数。

2 个答案:

答案 0 :(得分:1)

数字5没有参与比赛,可能是因为它比ft_min_word_len短;用

确认
show variables like 'ft%';

如果我拼出完整的单词" Five",这会给我一些比ft_min_word_len更长的东西,并且查询的工作方式与我认为您预期的一样。有关示例,请参阅this SQL Fiddle。

答案 1 :(得分:1)

首先,查看mysql服务器的全文设置:

> SHOW VARIABLES LIKE 'ft%';

输出可能如下所示:

Variable_name             Value           
------------------------  ----------------
ft_boolean_syntax         + -><()~*:""&|  
ft_max_word_len           84              
ft_min_word_len           4               
ft_query_expansion_limit  20              
ft_stopword_file          (built-in) 

您正在寻找ft_min_word_len。与此示例中一样,默认值为4

To change that,如果您想要搜索单字符单词(如您的数字),可以通过在选项文件中添加以下行来设置此变量(通常为my.ini):

[mysqld]
ft_min_word_len=1

然后重新启动服务器并重建FULLTEXT索引:

REPAIR TABLE YourTable QUICK;

请记住,这会增加您的全文索引非常重要。

这个答案是基于这样的假设,即您使用MyISAM作为表引擎。如果您使用的是InnoDB,则关键字为innodb_ft_min_token_size