【问题标题】:MySQL Joins and Full Text searchMySQL 连接和全文搜索
【发布时间】: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


【解决方案1】:

我建议使用单独的较小查询并使用 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

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

表名 | 身份证 | 相关性

照片 | 1 | 1

照片 | 2 | 0

人 | 1 | 1

关键字 | 10 | 1

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

【讨论】:

  • 但 UNION 不会使用相同的列连接结果。我查询的所有表都有不同的列...
  • 联合要求列具有相同的数据类型而不是相同的名称。
  • 感谢您的回复。我不确定如何在我拥有的搜索中实现这一点
  • 我添加了一个示例的小更新,希望它有助于说明我在说什么。
  • 谢谢 Jrod,这很有帮助,尽管我仍然不确定如何在我的结构中使用它。据我所知,该查询将产生很多 photoID、很多关键字 ID 和很多 peopleID,而不是所有 photoID。
【解决方案2】:

我建议不要使用 MySQL,而是使用真正的 FTS 解决方案,例如 Lucene,希望在 MySQL 中使用 FTS 的人经常将其与 MySQL 结合使用。 https://stackoverflow.com/questions/553055/best-full-text-search-for-mysql

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    相关资源
    最近更新 更多