Mysql全文搜索排除结果

时间:2011-04-07 12:56:24

标签: mysql search full-text-search

我有一个问题,我在我的网站上进行全文搜索,并希望在此处排除一些结果是我使用的代码

SELECT *, MATCH(p_title, p_desc) AGAINST ('".$string."') AS score 
FROM posts 
WHERE MATCH(p_title, p_desc) AGAINST ('".$string."') 
ORDER BY score DESC LIMIT 12

现在当我添加例如WHERE id!= 1 AND WHERE test!= 1到SELECT结束时 这不起作用,我用谷歌搜索但没有找到任何与此相关的内容。这有可能吗?

我找到了一种使用php的方法

if($id != $list['id'] AND $list['test'] != 1) { 
// CODE
}

但这不是我想要的。 谢谢你的帮助

1 个答案:

答案 0 :(得分:2)

如果你改变了

SELECT *, MATCH(p_title, p_desc) AGAINST ('".$string."') AS score     
FROM posts 
WHERE MATCH(p_title, p_desc) AGAINST ('".$string."') 
ORDER BY score DESC LIMIT 12

要:

SELECT *, MATCH(p_title, p_desc) AGAINST ('".$string."') AS score     
FROM posts 
WHERE MATCH(p_title, p_desc) AGAINST ('".$string."') 
  AND (id <> 1) AND (test <> 1)
ORDER BY score DESC LIMIT 12

它应该可以工作,当然你不能在第一个之后添加额外的WHERE条款 如果您想添加额外的项目进行过滤,则需要使用AND

另请注意,执行SELECT *会降低您的查询方式。 更好地列出您要列出的字段,这将使您的查询更快 确保在p_title和p_desc上有一个索引以保持速度可接受。

如果您希望搜索更智能,并且还要返回与$string相关的项目,则可以将代码更改为:

SELECT *, MATCH(p_title, p_desc) AGAINST ('".$string."') AS score     
FROM posts 
WHERE MATCH(p_title, p_desc) AGAINST ('".$string."' WITH QUERY EXPANSION) 
  AND (id <> 1) AND (test <> 1)
ORDER BY score DESC LIMIT 12

这将让MySQL进行第二次传递,其中第一遍中找到的术语用于查找与$ string不匹配的额外项目,但执行匹配中找到的数据第一遍。

请参阅:http://dev.mysql.com/doc/refman/5.5/en/fulltext-query-expansion.html