2015-10-18 61 views
2

我正在使用全文索引来识别相似的列内容。 我注意到比赛得分不像我期待的那样。Mysql全文搜索索引 - Match()/ Against()对不同的结果给予相同的优先级

在我的表格中,我存储了电子游戏的名称。当我搜索“生化危机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更高的分数。

回答

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

[mysqld] 
ft_min_word_len=1 

然后重新启动:

To change that,如果你想要一个字符的词(如你的电话号码),可搜索,则可以通过以下行中的选项文件(通常my.ini)设置此变量服务器和重建FULLTEXT指标:

REPAIR TABLE YourTable QUICK; 

请记住,这会增加你的全文索引相当显著。

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

+0

工作得很好。谢谢 – Goot

1

5号不参加比赛,可能是因为它比ft_min_word_len短;确认与

show variables like 'ft%'; 

如果我拼写出完整的单词“五个一”,这给了我一些长于ft_min_word_len和查询工作,因为我觉得你期望它。有关示例,请参阅this SQL小提琴。