【发布时间】:2011-02-22 18:54:13
【问题描述】:
我一直在对全文搜索进行一些研究,因为我们意识到一系列 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
如果我从MATCH 语句中删除d.name,它就可以工作。我在该列上有一个全文索引。
我看到一篇文章说对这个表使用OR MATCH,但这不会失去将它们排列在一起或正确匹配它们的有效性吗?
据说其他地方可以使用UNIONs,但我不知道如何正确使用。
任何建议将不胜感激。
在长期解决方案的想法中,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)
【问题讨论】:
-
我修复了“快速解决”问题,可以在这里找到:stackoverflow.com/questions/2891037/…
标签: mysql full-text-search lucene sphinx