【发布时间】:2011-09-08 16:52:10
【问题描述】:
那里有全文的 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
这是数据库架构:
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 表类型 possible_keys key key_len ref rows 1 张简单的照片 ALL NULL NULL NULL NULL 89830 1 简单的照片贡献者 ALL NULL NULL NULL NULL 149635 1 张简单照片人物 ALL NULL NULL NULL NULL 110606 1 简单的人 eq_ref PRIMARY PRIMARY 4 1 1 SIMPLE photoKeyword ALL NULL NULL NULL NULL 699102 1 简单的关键字 eq_ref PRIMARY PRIMARY 4 1我的网站访问者应该能够搜索: “Brad Pitt Angelina Jolie Dorchester Hotel Sunglasses @MG” - 这应该从“people.people”表和“photos.caption”表中找到“Brad Pitt”和“Angelina Jolie”。它还应该从“photos.caption”表中找到“Dorchester Hotel”,从“keywords.keyword”表中找到“Sunglasses”,最后,它应该在“photoContributor.contributorRef”表中找到“@MG”。
如有任何帮助,我们将不胜感激......
【问题讨论】:
-
在您的问题中添加
EXPLAIN SELECT ... -
作为参考,如果您正在扩展一个问题,而没有实际更改所要求的基本信息,那么您应该只编辑原始内容,而不是重新开始。
-
您需要粘贴这些表的架构(
SHOW CREATE TABLE查询的结果应该没问题)。另外,需要明确的是,您似乎正在使用 MyISAM 的全文索引? -
嗨 TehShrike。是的,我在我的桌子上使用 MyISAM。我还编辑了问题以包含基本的数据库架构...
-
@Martin 问题是如果该表使用全文索引,那么该表无法使用另一个索引。这意味着表之间的连接操作是在没有索引的情况下完成的。因此,我建议您在查询中只使用一个(或几个)全文搜索。我建议用
LIKE子句替换其他搜索。您应该测试查询中的哪个全文搜索效果最好。
标签: mysql database indexing full-text-search