2011-03-07 81 views
1

虽然这个主题已被广泛讨论,但它让我感到非常困惑,并且我一直无法提炼出正确的答案。你能帮我正确的方向吗?谢谢。全文索引在MySQL视图或更正搜索联接表的方式

我有这种设置:

页面(P)
sid | title | content
部件(W)
sid | content
:表page由参考表widget_to_page的方式连接到表widget widget_to_page(wtp)
sid | page_sid | widget_sid

我已经创建了一个p.title全文索引,p.contentw.content

接下来,我想给页面控件组合:

SELECT *, MATCH(p.title, p.content, w.content) AGAINST("'.$keyword.'") AS score 
FROM page p, widget w, widget_to_page wtp 
WHERE MATCH(p.title, p.content, w.content) AGAINST("'.$keyword.'") 
AND p.sid = wtp.page_sid 
AND w.sid = wtp.widget_sid 
ORDER BY score DESC 

一些言论:

  1. 这显然不起作用... :-)
  2. 我一直在阅读,如果我使用这个语法t o加入表(或使用JOIN)语句,它会导致MySQL忽略全文索引。什么是正确的方法?

我已经尝试了另一种是创建一个MySQL视图了以下声明:

SELECT * 
FROM page p, widget w, widget_to_page wtp 
WHERE p.sid = wtp.page_sid 
AND w.sid = wtp.widget_sid 

但是,这也似乎并没有工作。有些人说在这个特定的视图上创建一个全文索引,但我无法在PHPMyAdmin中找到任何选项来做到这一点,我不知道这是甚至可能的。

总之......这种情况下的最佳做法是什么?谢谢。

回答

3

FULLTEXT索引可以包含多个列,但这些列必须位于同一个表中。因此,您将无法在单个索引中覆盖2个表中的3列。你至少需要2个索引才能完成。

此外,FULLTEXT索引只能与MyISAM存储引擎一起工作,所以如果您使用的是像InnoDB这样的事务引擎,则不起作用。你应该阅读手册,以了解其他功能和全文索引的限制(包括布尔模式,停用词等):

http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html

假设你正在使用MyISAM数据,您可以创建(第1个全文索引.title,p.content)和另一个全文索引(w.content),然后分别查询两个索引并使用UNION ALL合并结果。

结果查询将是这样的,但你需要调整它来满足您的具体要求:

select page_sid, page_title, sum(score) as total_score 
from 
(
SELECT p.sid as page_sid,p.title as page_title,NULL as widget_sid, 
    MATCH(p.title, p.content) AGAINST("'.$keyword.'") AS score 
FROM page p 
WHERE MATCH(p.title, p.content) AGAINST("'.$keyword.'") 
UNION 
SELECT p.sid as page_sid,p.title as page_title,w.sid as widget_sid, 
    MATCH(w.content) AGAINST("'.$keyword.'") AS score 
FROM page p 
    inner join widget_to_page wtp on p.sid = wtp.page_sid 
    inner join widget w on w.sid = wtp.widget_sid 
WHERE MATCH(w.content) AGAINST("'.$keyword.'") 
) as sub_query 
group by page_sid 
ORDER BY total_score DESC 
+0

谢谢您的回答,但我不断收到错误'未知列“w.sid 'in'field list'',关于'w.sid'的第一个实例。如果我删除'w.sid作为widget_sid,'我得到一个错误'找不到匹配列列表的FULLTEXT索引。 你有什么建议? – maartenmachiels 2011-03-08 09:18:50

+0

对不起,我之前有一个错字。我切换了w.sid和NULL。我现在修好了。 – 2011-03-08 16:11:37

+0

此外,请注意,您需要创建两个新的全文索引:一个(p.title,p.content)和一个(w.content)。 – 2011-03-08 16:12:16