Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mysql recherche une chaîne et un nombre en utilisant MATCH() AGAINST()

Si vous avez besoin de Fiat et 500 partout où l'ordre n'a pas d'importance, alors

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

Si vous avez besoin de Fiat 500 ensemble, alors

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

Si vous avez besoin de Fiat et zéro ou plus 500 , alors

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

Si vous avez besoin de 500 et zéro ou plusieurs Fiat , alors

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

Essayez-le !!!

MISE À JOUR 2013-01-28 18:28 HAE

Voici les paramètres par défaut pour la recherche 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>

Notez que ft_min_word_len vaut 4 par défaut. Le jeton 500 est de longueur 3. Il ne sera donc pas indexé du tout. Vous devrez faire trois (3) choses :

ÉTAPE 01 : Configuration pour des jetons de chaîne plus petits

Ajoutez ceci à /etc/my.cnf

[mysqld]
ft_min_word_len = 1

ÉTAPE 02 :Redémarrez mysql

service mysql restart

ÉTAPE 03 :Réindexer tous les index dans les models tableau

Vous pouvez simplement déposer et ajouter l'index FULLTEXT

ou faites-le par étapes et voyez à l'avance quelle sera sa taille

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;

Lorsque vous êtes satisfait, cela a fonctionné, puis exécutez

DROP TABLE models_old;

Essayez-le !!!