2010-05-22 9 views
2

J'ai fait un peu de recherche sur les recherches de texte intégral car nous avons réalisé qu'une série d'instructions LIKE sont terribles. Ma première trouvaille était des recherches en texte intégral MySQL. J'ai essayé d'implémenter ceci et cela a fonctionné sur une table, échoué quand j'essayais de joindre plusieurs tables, et donc j'ai consulté les articles de stackoverflow (regardez la fin pour une liste de ceux que j'ai été)Recherche de texte intégral MySQL sur plusieurs tables - Solution rapide/longue?

I n'a rien vu qui ait clairement répondu à mes questions. J'essaie de faire cela littéralement dans une heure ou deux (solution rapide) mais je veux aussi faire une meilleure solution à long terme. Voici ma question:

SELECT 
    a.`product_id`, a.`name`, a.`slug`, a.`description`, b.`list_price`, 
    b.`price`, c.`image`, c.`swatch`, e.`name` AS industry 
FROM `products` AS a 
LEFT JOIN `website_products` AS b ON (a.`product_id` = b.`product_id`) 
LEFT JOIN 
    (SELECT `product_id`, `image`, `swatch` FROM `product_images` 
     WHERE `sequence` = 0) AS c ON (a.`product_id` = c.`product_id`) 
LEFT JOIN `brands` AS d ON (a.`brand_id` = d.`brand_id`) 
INNER JOIN `industries` AS e ON (a.`industry_id` = e.`industry_id`) 
WHERE 
    b.`website_id` = 96 
    AND b.`status` = 1 
    AND b.`active` = 1 
    AND MATCH(a.`name`, a.`sku`, a.`description`, d.`name`) AGAINST ('ashley sofa') 
GROUP BY a.`product_id` 
ORDER BY b.`sequence` LIMIT 0, 9 

L'erreur que je reçois est: Incorrect arguments to MATCH

Si je retire d.name de la déclaration MATCH cela fonctionne. J'ai un index de texte intégral sur cette colonne.

J'ai vu l'un des articles dire d'utiliser un OR MATCH pour cette table, mais cela ne va-t-il pas être difficile de les classer ensemble ou de les faire correspondre correctement?

D'autres endroits ont dit utiliser UNION s mais je ne sais pas comment le faire correctement.

Un conseil serait grandement apprécié. Dans l'idée d'une solution à long terme, il semble que Sphinx ou Lucene est le meilleur. Maintenant, en aucun cas et je suis un gourou MySQL, et j'ai entendu dire que Lucene est un peu plus compliqué à configurer, toutes les recommandations ou les directions seraient géniales.

Articles:

MySQL full text search across multiple tables MySQL FULLTEXT Search Across >1 Table MySQL: how to make multiple table fulltext search Comparison of full text search engine - Lucene, Sphinx, Postgresql, MySQL? Searching across multiple tables (best practices)

+0

J'ai résolu le problème de "solution rapide", qui peut être trouvé ici: http://stackoverflow.com/questions/2891037/mysql-or-match-hangs-very-slow-on-multiple-tables –

Répondre

2

Pour la solution à court terme, je propose la création d'une table de seulement les valeurs en texte intégral, comme dans this question.

Pour la solution à long terme, s'il vous plaît jeter un oeil à Solr. Il est beaucoup plus facile à installer que Lucene, et pourtant vous donne la plupart de ses fonctionnalités. J'ai aussi entendu de bonnes choses à propos de Sphinx, mais je ne l'ai jamais utilisé personnellement.

+0

pour la solution à long terme! On dirait que nous allons probablement l'utiliser, mais pour le court terme, ce lien indique simplement que vous ne pouvez pas lier 2 tables dans le même MATCH, donc j'ai besoin de comprendre comment je peux le faire fonctionner. Quand j'utilise OR MATCH, cela prend une éternité (se fige essentiellement) et revient 15 minutes plus tard –