2011-09-08 92 views
6

任何全文MySQL专家在那里?MySQL加入和全文搜索

我昨天写了一个问题,询问如何使用全文搜索与大量连接有关的任何建议,有点懒洋洋地,我实际上没有尝试过。

从那以后,我对自己掌握了一个很好的尝试,在我的全文字段中构建了一些成功的测试查询。如果我不使用任何连接,并单独查询每个字段,全文函数将完美工作,相关性/布尔值也可以很好地发挥作用,但是......只要我添加我的连接以运行完整查询,它永远运行。

任何人都可以在我的查询中找到任何可能导致这种情况的事情,因为作为一个业余爱好者,我真的看不到它!

SELECT 

photos.photoID, 
photos.headline, 
photos.dateCreated, 
MATCH (people.people) AGAINST ('+sarah +harding' IN BOOLEAN MODE) AS Rel1 

FROM photos 

LEFT JOIN (photoPeople INNER JOIN people ON photoPeople.peopleID = people.PeopleID) 
ON photos.photoID = photoPeople.photoID AND MATCH (people.people) AGAINST ('+sarah +harding' IN BOOLEAN MODE) 

WHERE 

photos.photoStatus = 'Live' 

GROUP BY 

photos.photoID 

ORDER BY Rel1 

这是我的成功,个人查询之一:

SELECT 

photoID, 
headline, 
dateCreated, 
MATCH (caption) AGAINST ('+sarah +harding' IN BOOLEAN MODE) AS Relevance 

FROM photos 

WHERE 

photoStatus = 'Live' 

AND 

MATCH (caption) AGAINST ('+sarah +harding' IN BOOLEAN MODE) 

ORDER BY Relevance 

这是DB模式:

photos (tbl) 
photoID    INT(11)   Primary  Auto-Increment 
headline   Long-Text 
caption    Long-Text/FULLTEXT 
dateCreated   DateTime 

people (tbl) 
peopleID   INT(11)   Primary  Auto-Increment 
people    VarChar(255)/FULLTEXT 

photoPeople (tbl) 
photoID    INT(11) 
peopleID   INT(11) 

keywords (tbl) 
keywordID   INT(11)   Primary  Auto-Increment 
keyword    VarChar(255)/FULLTEXT 

photoKeyword (tbl) 
photoID    INT(11) 
keywordID   INT(11) 

photoContributor (tbl) 
photoID    INT(11) 
contributorRef  VarChar(100)/FULLTEXT 

这是我的EXPLAIN打印出来:

 
id select_type   table    type  possible_keys  key  key_len  ref  rows 
1 SIMPLE    photos    ALL   NULL    NULL  NULL  NULL  89830 
1 SIMPLE    photoContributor ALL   NULL    NULL  NULL  NULL  149635 
1 SIMPLE    photoPeople   ALL   NULL    NULL  NULL  NULL  110606 
1 SIMPLE    people    eq_ref  PRIMARY    PRIMARY  4  1 
1 SIMPLE    photoKeyword  ALL   NULL    NULL  NULL  NULL  699102 
1 SIMPLE    keywords   eq_ref  PRIMARY    PRIMARY  4  1 

我的网站访问者应该能够搜索: “布拉德皮特安吉丽娜朱莉多切斯特酒店太阳镜@MG” - 这应该从'people.people'表和'photos.caption'表中找到“Brad Pitt”和“Angelina Jolie”。它还应该从'photos.caption'表中找到“Dorchester Hotel”,在'keywords.keyword'表中找到“Sunglasses”,最后在'photoContributor.contributorRef'表中找到“@MG”。

任何帮助将受到欢迎...

+0

加上'EXPLAIN SELECT ...'你的问题 – sanmai

+0

作为参考,如果你正在扩大在一个问题,实际上并没有改变要求的基本信息,那么你应该只是编辑原始,而不是重新开始。 – Orbling

+0

您需要粘贴这些表的模式(SHOW CREATE TABLE'查询的结果应该没问题)。另外,要清楚,似乎你正在使用MyISAM的全文索引? – TehShrike

回答

3

我建议使用单独的较小查询和使用UNION创建一个综合作用的结果集。

这是另一个类似任务的问题。 Mysql Full text search across more than one table

更新

SELECT "Photos" AS TableName, photoID AS ID, MATCH (caption) AGAINST ('+sarah +harding' IN BOOLEAN MODE) AS Relevance 
FROM photos 
UNION ALL 
SELECT "People" AS TableName, peopleID AS ID, MATCH (people) AGAINST ('+sarah +harding' IN BOOLEAN MODE) 
FROM people 
UNION ALL 
SELECT "Keyword" AS TableName, keywordID AS ID, MATCH (keyword) AGAINST ('+sarah +harding' IN BOOLEAN MODE) 
FROM keyword 

我真的不知道你有什么样的数据,但它会产生类似:

表名 | ID | 相关性

照片| 1 | 1

照片| 2 | 0

人物| 1 | 1

关键词| 10 | 1

您可以添加额外的where子句以满足您的需求,但这是基本的想法。

+0

但是UNION不会将结果与相同的列结合在一起,我查询的所有表格都有不同的列... – TheCarver

+0

联合要求列具有相同的数据类型,而不是相同的名称 – Jrod

+0

感谢您的回复。在我有 – TheCarver