MySQL Joins и полнотекстовый поиск - PullRequest
6 голосов
/ 08 сентября 2011

Есть какие-нибудь полнотекстовые, эксперты по 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         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

Посетитель моего сайта должен иметь возможность искать: "Солнцезащитные очки отеля" Brad Pitt Angelina Jolie Dorchester Hotel @MG "- здесь должны быть найдены" Brad Pitt "и" Angelina Jolie "из таблицы" people.people "и, возможно, из таблицы" photos.caption ". Он также должен найти «Dorchester Hotel» из таблицы «photos.caption», «Sunglasses» из таблицы «words.keyword »и, наконец, найти« @MG »в таблице« photoContributor.contributorRef ».

Любая помощь по этому вопросу будет принята с благодарностью ...

Ответы [ 2 ]

3 голосов
/ 08 сентября 2011

Я предлагаю использовать отдельные меньшие запросы и использовать UNION для создания комбинированного набора результатов.

Вот еще один вопрос с аналогичной задачей. Mysql Полнотекстовый поиск по нескольким таблицам

Обновление

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 | 1019 * Релевантность *

Фотографии | 1 | 1

Фотографии | 2 | 0

Люди | 1 | 1

Ключевое слово | 10 | 1

Вы можете добавить дополнительные операторы where в соответствии с вашими потребностями, но это основная идея.

0 голосов
/ 22 сентября 2011

Я предлагаю не использовать MySQL и вместо этого использовать реальное решение FTS, такое как Lucene, которое часто объединяется с MySQL теми, кто хочет использовать FTS в MySQL. https://stackoverflow.com/questions/553055/best-full-text-search-for-mysql

...