我对MATCH AGAINST 函数有问题。
以下查询给了我相同的结果:
SELECT * FROM models MATCH(name) AGAINST('Fiat 500')
SELECT * FROM models MATCH(name) AGAINST('Fiat')
如何在全文表的列中搜索字符串和数字?
谢谢
如果您需要Fiat
并在任何顺序无关紧要的地方500
,那么
SELECT * FROM models MATCH(name) AGAINST('+Fiat +500');
如果你需要一起Fiat 500
,那么
SELECT * FROM models MATCH(name) AGAINST('+"Fiat 500"');
如果您需要 Fiat
和零个或多个500
,则
SELECT * FROM models MATCH(name) AGAINST('+Fiat 500');
如果您需要 500
和零个或多个Fiat
,则
SELECT * FROM models MATCH(name) AGAINST('Fiat +500');
试一试!!
更新 2013-01-28 18:28 EDT
以下是全文搜索的默认设置
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) |
+--------------------------+----------------+
5 rows in set (0.00 sec)
mysql>
请注意,默认情况下ft_min_word_len为 4。令牌 500 的长度为 3。因此,它根本不会被索引。您将必须做三 (3) 件事:
步骤01:配置较小的字符串令牌
将此添加到/etc/my.cnf
[mysqld]
ft_min_word_len = 1
步骤02:重新启动mysql
service mysql restart
步骤03:重新索引models
表中的所有索引
您可以删除并添加全文索引
或者分阶段进行,看看它会提前变大
CREATE TABLE models_new LIKE models;
ALTER TABLE models_new DROP INDEX name;
ALTER TABLE models_new ADD FULLTEXT name (name);
ALTER TABLE models_new DISABLE KEYS;
INSERT INTO models_new SELECT * FROM models;
ALTER TABLE models_new ENABLE KEYS;
ALTER TABLE models RENAME models_old;
ALTER TABLE models_new RENAME models;
当您满意此操作时,请运行
DROP TABLE models_old;
试一试!!
一它可以帮助其他人,如果您使用的是InnoDB,则需要使用一组不同的mysql.cnf属性
例如
show variables like 'innodb_ft%';
并在 my.cnf 中设置以下值而不是ft_min_word_len
innodb_ft_min_token_size=1