Mysql全文搜索索引 - Match()/Against()对不同结果给予相同的优先级

标签 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》更高的分数。

最佳答案

首先,查看您的 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/

相关文章:

php - 使用 php 变量和 SQL 语句的日期范围过滤器

mysql防止删除正在使用的记录

mysql full join error-#1054 - Unknown column 'feesmaster.PAIDAMOUNT' in 'field list'

php - 网页上的照片破裂

mysql - 内部 SQL 查询优化

mysql - 如何从共享相关信息的两个表中删除记录?

mysql - Weka 未知数据类型

mysql - Teamsite错误: Couldn't rollback jdbc connection.连接关闭后不允许进行任何操作

php - 在 MySql 数据库中查询当前日期后 30 天内具有 'Birthday' 日期字段的条目

php - 如何从使用 PHP 和 MYSQL 的嵌套模型集中删除节点