2010-05-18 9 views
1

J'ai travaillé avec Sql Server par le passé et j'ai utilisé cette fonction très intéressante appelée Sql Full Text Search. Maintenant, je dois travailler avec MySQL. Quelqu'un peut-il me dire quel est l'équivalent de la recherche en texte intégral dans MySQL? J'utilise l'édition gratuite de MySQL et non une version commerciale. Si non, alors que pouvons-nous faire d'autre pour imiter la recherche plein texte et dépasser les limites de l'opérateur LIKE?Quel est l'équivalent MySql de Sql Server Full Text Search?

Merci à l'avance :)

Répondre

3

Voir la documentation sur le support de recherche de texte intégral dans mysql:

http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

Vous voulez appliquer des index en texte intégral à des colonnes afin de soutenir la pleine recherche de texte sur ces colonnes. Notez que mysql ne supporte que l'indexation en texte intégral sur les tables MyISAM.

À titre d'exemple, et au cas où le lien ci-dessus va mort à un moment donné, voir un exemple complet, de la documentation:

mysql> CREATE TABLE articles (
    -> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, 
    -> title VARCHAR(200), 
    -> body TEXT, 
    -> FULLTEXT (title,body) 
    ->); 
Query OK, 0 rows affected (0.00 sec) 

mysql> INSERT INTO articles (title,body) VALUES 
    -> ('MySQL Tutorial','DBMS stands for DataBase ...'), 
    -> ('How To Use MySQL Well','After you went through a ...'), 
    -> ('Optimizing MySQL','In this tutorial we will show ...'), 
    -> ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), 
    -> ('MySQL vs. YourSQL','In the following database comparison ...'), 
    -> ('MySQL Security','When configured properly, MySQL ...'); 
Query OK, 6 rows affected (0.00 sec) 
Records: 6 Duplicates: 0 Warnings: 0 

mysql> SELECT * FROM articles 
    -> WHERE MATCH (title,body) 
    -> AGAINST ('database' IN NATURAL LANGUAGE MODE); 
+----+-------------------+------------------------------------------+ 
| id | title    | body          | 
+----+-------------------+------------------------------------------+ 
| 5 | MySQL vs. YourSQL | In the following database comparison ... | 
| 1 | MySQL Tutorial | DBMS stands for DataBase ...    | 
+----+-------------------+------------------------------------------+ 

Ref http://dev.mysql.com/doc/refman/5.1/en/fulltext-natural-language.html

+0

Salut Kazar, votre réponse est ver l'information. Mais toutes mes tables sont InnoDB parce que j'utilise des contraintes d'intégrité référentielle. À quoi servirait le maintien du moteur MyISAM? Est-ce que la plupart des bases de données d'applications réelles n'auront pas le moteur InnoDB? Pourquoi y a-t-il une telle restriction? Et maintenant dois-je supprimer toutes les constantes d'intégrité référentielle de toutes mes tables pour le faire fonctionner avec la recherche en texte intégral? – TCM

+0

@Nitesh: 'InnoDB' est un moteur transactionnel avec une concurrence par verrous. Un support d'index pour un tel moteur serait une tâche assez difficile, car il aurait besoin d'être intégré dans la gestion des transactions, et 'InnoDB' n'a pas de support interne pour les index non btree. – Quassnoi

+0

Ok, j'ai vu un lien sur stackoverflow lui-même: -http: //stackoverflow.com/questions/2638698/mysql-full-text-search-workaround-for-innodb-tables qui demande de créer des tables temporaires et de les supprimer ce qui serait très coûteux à créer et à supprimer à chaque opération de recherche. Au lieu de cela je vais répliquer mes quelques tables sur lesquelles je veux que la recherche en texte intégral soit faite. En passant, je n'ai jamais sélectionné de type de moteur dans Sql Server 2005 et il supportait toujours l'intégrité référentielle et même la recherche en texte intégral Sql. En fait, la recherche en texte intégral est prise en charge depuis SQL Server 2000 et il s'est amélioré en 2005 – TCM

2

Sur MyISAM tables, MySQL soutient FULLTEXT index:

CREATE TABLE mytable (id INT, caption TEXT, content TEXT, FULLTEXT KEY fx_mytable_caption_content (caption, content)) ENGINE=MyISAM; 

SELECT * 
FROM mytable 
WHERE MATCH(caption, content) AGAINST ('my search query') 
1

Vous pouvez créer un index de texte intégral sur une ou plusieurs colonnes. Vous pouvez ensuite utiliser les requêtes de recherche de texte intégral pour interroger la table. Voir MySQL Full-Text index et MySQL Full-text Search functions.

Une requête typique ressemble à:

SELECT * FROM books 
WHERE MATCH (title, summary) AGAINST ('harry potter') 
ORDER BY MATCH (title, summary) AGAINST ('harry potter') 
LIMIT 0, 10 
+0

Peut-être préférable d'attribuer le résultat de la correspondance à un nom, puis commander par ce nom? Par exemple. O WH MATCH (titre, résumé) CONTRE («harry potter») COMME INDIQUER LA PERTINENCE? MySql va probablement l'optimiser, mais quand même ... – Kazar

Questions connexes