2011-09-20 126 views
0

在我试图通过相关性返回全文搜索结果时,我没有得到期望的结果。下面是一个实际的输出查询示例:mysql fulltext布尔搜索 - 按相关性排序

SELECT *, 
     ((9 * (MATCH(title) AGAINST ('"apple 8"' IN BOOLEAN MODE))) + 
     (8 * (MATCH(title) AGAINST ('+apple +8' IN BOOLEAN MODE))) + 
     (7 * (MATCH(title) AGAINST ('apple* 8 ' IN BOOLEAN MODE))) + 
     (6 * (MATCH(description) AGAINST ('"apple 8"' IN BOOLEAN MODE))) + 
     (5 * (MATCH(description) AGAINST ('+apple +8 apple* 8 ' IN BOOLEAN MODE)))) as relevance 
FROM items 
WHERE status='1' 
AND ((MATCH(title, description) AGAINST ('"apple 8" +apple +8 apple* 8 ' IN BOOLEAN MODE))) 
ORDER BY cat_featured DESC 
     , relevance DESC 

我敢肯定,这可能是全乱了,但我已经尝试了不同的设置和继续得到同样的结果......在这个例子中,含有“苹果项目“标题中的”8“被返回55次结果中的第17次,而不是像我希望的那样是第1次,因为它是唯一具有标题中两个术语的结果。我哪里错了?

+0

我绝不是专家,但你可能想将你的全文搜索,而不是使用单独的那些负载。我问了一个问题[这里](http://stackoverflow.com/questions/5417792/normalise-mysql-fulltext-score),这可能有助于返回每一行的相关性。 – Bojangles

+0

非常感谢您的帮助。不幸的是,你的问题并没有让我更清楚......我发现这个东西令人难以置信的混乱!我刚开始时只有两组比赛(标题为1,描述为1),并且获得了相同的输出,所以我一直在玩弄它,试图弄清楚如何操纵结果的顺序。第一部分工作(精确匹配首先返回)。我不明白如何得到包含这两个词的结果。 – Jen

+0

有很多东西让我不知所措 - 你并不孤单。不幸的是,MySQL的更高级功能就是其中之一。 – Bojangles

回答

0

(MATCH(xyz) AGAINST('abc'))与任意数字相乘是错误的。你不能这样做,因为它们不是实际的数字。

更多在这里阅读Using MySQL Full-text Searching

0

这是一个基本的例子做类似的事情。希望这可以帮助。

在此之前,您需要在这两列上创建一个FULLTEXT索引。如果你使用的是phpMyadmin,这很容易。

https://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html

select *, MATCH(title, description) AGAINST("your string here" IN BOOLEAN MODE) AS relevance 
     from items 
     where 
     active = 1 and 
     MATCH(title, description) AGAINST("your string here" IN BOOLEAN MODE) order by relevance desc