Mysql 使用 MATCH() AGAINST st() 搜索字符串和数字



我对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

相关内容

  • 没有找到相关文章

最新更新