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

时间:2013-01-28 22:25:21

标签: mysql search numbers match-against

我的MATCH AGAINST功能有问题。

以下查询给出了相同的结果:

SELECT * FROM models MATCH(name) AGAINST('Fiat 500')
SELECT * FROM models MATCH(name) AGAINST('Fiat')

如何在FULL TEXT表的列中搜索字符串和数字?

由于

2 个答案:

答案 0 :(得分:31)

如果在订单无关紧要的任何地方需要Fiat500,那么

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

以下是FULLTEXT搜索的默认设置

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

中的所有索引

您可以删除并添加FULLTEXT索引

或分阶段进行,看看它会提前有多大

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;

试一试!!!

答案 1 :(得分:0)

万一它可以帮助别人,如果你使用的是InnoDB,你需要使用一组不同的mysql.cnf属性

例如

show variables like 'innodb_ft%';

并在my.cnf中设置以下值而不是ft_min_word_len

innodb_ft_min_token_size=1