我需要Mysql全文搜索实现在我的网站上。我的意图是,如果用户输入搜索词,大多数相关结果应该是第一位的,其他结果应该是第一位的。
SELECT pr.*
, MATCH (pr.title) AGAINST ('Samsung Galaxy S6' IN BOOLEAN MODE) AS relevance_1
, MATCH (pr.description, pr.tags) AGAINST ('Samsung Galaxy S6' IN BOOLEAN MODE) AS relevance_2
, MATCH (category.name, category.description) AGAINST ('Samsung Galaxy S6' IN BOOLEAN MODE) AS relevance_3
FROM products AS pr
LEFT JOIN category ON category.id = pr.category_id
WHERE MATCH (pr.title, pr.description, pr.tags, category.name, category.description) AGAINST ('Samsung Galaxy S6' IN BOOLEAN MODE)
ORDER BY (relevance_1 * 3) + (relevance_2 * 2) + relevance_3 DESC这是我的方琴键。
发布于 2015-08-04 10:41:44
在全文搜索中,您需要在您的小提琴中使用一个FULLTEXT索引,我可以看到有两个索引,一个用于表products,另一个用于产品,您在3列上有一个复合索引,title, description, tags,对于类别,您有包含2列的复合索引,在select语句中,您引用的是一个列标题(别名为relevance_1),这将导致错误。
找不到与列列表匹配的全文索引
因为只能为标题列找到索引,所以必须在MATCH()语句中指定定义全文索引的所有列,因此WHERE子句也存在相同的问题,其中包括表产品中的3列和类别中的2列,并且您已经在一条MATCH语句中定义了它们。
匹配(pr.title,pr.description,pr.tags,category.name,category.description)
这也是错误的,您必须根据全文索引定义指定两个匹配语句,这些匹配语句的标准取决于您如何使用AND/OR来匹配它们。
因此,最终的工作查询将类似于
SELECT pr.*
, MATCH (pr.title,pr.description, pr.tags) AGAINST ('Samsung Galaxy S6' IN BOOLEAN MODE) AS relevance_2
, MATCH (category.name, category.description) AGAINST ('Samsung Galaxy S6' IN BOOLEAN MODE) AS relevance_3
FROM products AS pr
LEFT JOIN category ON category.id = pr.category_id
WHERE MATCH (pr.title, pr.description, pr.tags) AGAINST ('Samsung Galaxy S6' IN BOOLEAN MODE)
OR
MATCH (category.name, category.description) AGAINST ('Samsung Galaxy S6' IN BOOLEAN MODE)
ORDER BY (relevance_2 * 2) + relevance_3 DESChttps://stackoverflow.com/questions/31805323
复制相似问题