跨多个表的MySQL全文搜索 - 快速/长期解决方案?

时间:2010-05-22 19:34:11

标签: mysql full-text-search lucene sphinx

我一直在对全文搜索进行一些研究,因为我们意识到一系列LIKE语句很糟糕。我的第一个发现是MySQL全文搜索。我尝试实现这个并且它在一个表上工作,当我尝试连接多个表时失败了,所以我查阅了stackoverflow的文章(看看最后的列表,我去过的那些)

我没有看到任何明确回答我问题的内容。我试图在一两个小时内完成这项工作(快速解决方案),但我也想做一个更好的长期解决方案。这是我的疑问:

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

我得到的错误是:Incorrect arguments to MATCH

如果我从d.name语句中删除了MATCH,那就可以了。我在该专栏上有一个全文索引。

我看到其中一篇文章说使用OR MATCH作为此表,但不会失去能够将它们排在一起或正确匹配的效果吗?

其他地方说使用UNION但我不知道如何正确地做到这一点。

非常感谢任何建议。


在长期解决方案的想法中,似乎Sphinx或Lucene是最好的。现在绝不是我的MySQL大师,我听说Lucene设置起来有点复杂,任何建议或方向都会很棒。

文章:

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)

1 个答案:

答案 0 :(得分:2)

对于短期解决方案,我建议创建一个仅包含全文值的表格,如this question中所示。

对于长期解决方案,请查看Solr。它比Lucene更容易安装,但却为您提供了大部分功能。我也听说过狮身人面像的好东西,但是没有亲自使用它。