我一直在对全文搜索进行一些研究,因为我们意识到一系列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)
答案 0 :(得分:2)
对于短期解决方案,我建议创建一个仅包含全文值的表格,如this question中所示。
对于长期解决方案,请查看Solr。它比Lucene更容易安装,但却为您提供了大部分功能。我也听说过狮身人面像的好东西,但是没有亲自使用它。