MySQL视图的全文索引或更正在连接表中搜索的方式

时间:2011-03-07 13:46:18

标签: mysql join view indexing full-text-search

虽然这个话题已被广泛讨论,但它让我非常困惑,我无法提炼出正确的答案。你能帮我正确的方向吗?感谢。

我有这样的设置:表page通过参考表widget连接到表widget_to_page

第(p)页
sid | title | content
小部件(w)
sid | content
widget_to_page(wtp)
sid | page_sid | widget_sid

我在p.titlep.contentw.content

上创建了全文索引

接下来,我想看一下page-widget-combination:

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. 我一直在阅读如果我使用这种语法来连接表(或使用JOIN)语句,那么它会导致MySQL忽略全文索引。什么是正确的方法?
  3. 我尝试过的另一种方法是用以下语句创建一个MySQL视图:

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

    但这似乎也不起作用。有些人谈到在这个特定的视图上创建全文索引,但我在PHPMyAdmin中找不到任何选项来做这个,我不知道这是否可能。

    简而言之......在这种情况下,最佳做法是什么?感谢。

1 个答案:

答案 0 :(得分:3)

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

此外,FULLTEXT索引仅适用于MyISAM存储引擎,因此如果您使用像InnoDB这样的事务引擎,则无法使用。您应该阅读手册以了解全文索引的其他功能和限制(包括布尔模式,停用词等):

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

假设您正在使用MyISAM,您可以在(p.title,p.content)上创建1个全文索引,在(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