那里有MySQL专家的全文吗?

昨天我写了一个问题,询问如何使用带有大量联接的全文本搜索的任何建议,这有点懒惰,实际上我没有做过任何尝试。

从那时起,我就自己尝试了一个很好的尝试,针对我的全文本字段构建了一些成功的测试查询。如果我不使用任何联接,并分别查询每个字段,则全文功能可以正常工作,并且相关性/ bool 值也可以很好地发挥性能,但是...添加我的联接以运行完整查询后,... ,它将永远运行。

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

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

这是数据库模式:
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

这是我的解释打印输出:

id select_type表类型可能的键关键ke​​y_len引用行
1张简单的照片全部NULL NULL NULL NULL 89830
1 SIMPLE photoContributor ALL NULL NULL NULL NULL 149635
1 SIMPLE photoPeople ALL NULL NULL NULL NULL 110606
1个人eq_ref主要PRIMARY 4 1
1 SIMPLE photoKeyword ALL NULL NULL NULL NULL 699102
1个简单的关键字eq_ref PRIMARY PRIMARY 4 1

我的网站访问者应该可以搜索:
“布拉德·皮特(Brad Pitt)安吉丽娜·朱莉(Angelina Jolie Dorchester)太阳镜@MG”-从“people.people”表以及“photos.caption”表中也可以找到“布拉德·皮特(Brad Pitt)”和“安吉丽娜·朱莉(Angelina Jolie)”。它还应该从“photos.caption”表中找到“Dorchester Hotel”,从“keywords.keyword”表中找到“Sunglasses”,最后,应该在“photoContributor.contributorRef”表中找到“@MG”。

对此将有任何帮助...

最佳答案

我建议使用单独的较小查询,并使用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子句以适合您的需求,但这是基本思想。

关于mysql - MySQL连接和全文搜索,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7351684/

10-13 07:32
查看更多