Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Suche nach String und Zahl mit MATCH() AGAINST()

Wenn Sie Fiat benötigen und 500 überall dort, wo die Reihenfolge keine Rolle spielt, dann

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

Wenn Sie Fiat 500 benötigen zusammen, dann

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

Wenn Sie Fiat benötigen und null oder mehr 500 , dann

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

Wenn Sie 500 benötigen und null oder mehr Fiat , dann

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

Probieren Sie es aus !!!

UPDATE 2013-01-28 18:28 EDT

Hier sind die Standardeinstellungen für die VOLLTEXT-Suche

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>

Beachten Sie, dass ft_min_word_len ist standardmäßig 4. Das Token 500 hat die Länge 3. Daher wird es überhaupt nicht indiziert. Sie müssen drei (3) Dinge tun:

SCHRITT 01:Konfiguration für kleinere Zeichenfolgen-Token

Fügen Sie dies zu /etc/my.cnf hinzu

[mysqld]
ft_min_word_len = 1

SCHRITT 02 :Starten Sie mysql neu

service mysql restart

SCHRITT 03:Alle Indizes in den models neu indizieren Tabelle

Sie könnten den FULLTEXT-Index einfach löschen und hinzufügen

oder machen Sie es in Etappen und sehen Sie im Voraus, wie groß es wird

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;

Wenn Sie zufrieden sind, dass dies funktioniert hat, führen Sie es aus

DROP TABLE models_old;

Probieren Sie es aus !!!