2010-09-21 14 views
0

Disons que j'ai deux tables:contrôle croisé une table MySQL de contenu texte contre une autre table de mots-clés

Tableau 1 a les colonnes note_id (une clé unique) et NOTE_BODY (un grand texte texte de présentation).

Le tableau 2 contient les colonnes KEYWORD_ID (une clé unique) et KEYWORD (un mot clé).

Je souhaite obtenir un jeu de résultats qui indique les mots-clés de chaque fichier NOTE_BODY, sans imbriquer de boucles. Donc, idéalement, j'obtiendrais une ligne pour chaque match de NOTE_BODY-KEYWORD.

Quelle est la bonne façon de procéder? Je ne suis pas sûr si un JOIN + LIKE '%%' fait l'affaire, ou si je devrais utiliser l'indexation de texte intégral. Toute aide très appréciée ...

Répondre

2

Une solution d'indexation de texte intégral est la bonne façon de procéder si vous prévoyez d'avoir plusieurs lignes. Vous pouvez utiliser MySQL's native solution si vous utilisez le moteur de stockage MyISAM, mais vous pouvez également prendre en compte les moteurs de recherche tiers populaires Sphinx et Apache Lucene.

D'autre part, un simple INNER JOIN aurait fait l'affaire:

SELECT t1.note_id, t1.note_body, t2.keyword 
FROM table_1 t1 
JOIN table_2 t2 ON (t1.note_body LIKE CONCAT('%', t2.keyword, '%')); 

Cas de test:

CREATE TABLE table_1 (note_id int, note_body varchar(100)); 
CREATE TABLE table_2 (keyword_id int, keyword varchar(50)); 

INSERT INTO table_1 VALUES (1, 'Hello Stack Overflow'); 
INSERT INTO table_1 VALUES (2, 'Hello World'); 
INSERT INTO table_1 VALUES (3, 'Hello, my name is Daniel'); 
INSERT INTO table_1 VALUES (4, 'Goodbye'); 

INSERT INTO table_2 VALUES (1, 'Hello'); 
INSERT INTO table_2 VALUES (2, 'name'); 

Résultat:

+---------+--------------------------+---------+ 
| note_id | note_body    | keyword | 
+---------+--------------------------+---------+ 
|  1 | Hello Stack Overflow  | Hello | 
|  2 | Hello World    | Hello | 
|  3 | Hello, my name is Daniel | Hello | 
|  3 | Hello, my name is Daniel | name | 
+---------+--------------------------+---------+ 
4 rows in set (0.00 sec) 
+0

Impressionnant, merci. Je vais opter pour l'option d'indexation, mais bon aussi de savoir que la jointure s'en chargera si l'ensemble de données impliquées est assez petit (après de nombreuses tentatives je ne peux toujours pas garder mes JOINs droites ...). – NChase