我使用全文索引来识别类似的列内容。 我注意到比赛得分并不像我期待的那样。
在我的表格中,我存储了电子游戏的名称。当我在搜索生化危机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提供更高的分数。
答案 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
。