我使用全文索引来识别类似的列内容。 我注意到比赛得分并不像我预期的那样。
在我的表中,我存储了视频游戏的名称。当我搜索“生化危机 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》更高的分数。
最佳答案
首先,查看您的 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
.
关于Mysql全文搜索索引 - Match()/Against()对不同结果给予相同的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33201593/