MySQL несколько Id поисков - PullRequest
3 голосов
/ 05 октября 2010

Я пытаюсь добавить полнотекстовый поиск в систему. Запрос, который я хочу написать, должен включать несколько поисков с последующим поиском (если это вообще возможно).

У меня есть стол преподавателей и таблица предметов.

teacherProfile
teacherId [int] - primary key
subjectOneId [int]
subjectTwoId [int]
subjectThreeId [int]
teacherBiography [text]

subjects
subjectId [int]
subjectName [text]

Так что, в конечном итоге, я хочу получить набор результатов, аналогичный ..

teacherId [int]
teacherBiography [text]
( subjectOneName [text] )
( subjectTwoName [text] )
( subjectThreeName [text] )

Таким образом, эти последние три поля в скобках не существуют, но я хочу выполнить текстовый поиск по ним, нужно ли мне установить ограничение для внешнего ключа (что я бы предпочел не делать в случае дальнейшего воздействия на существующая система) или есть что-то более красноречивое, что я могу сделать?

1 Ответ

2 голосов
/ 05 октября 2010

MySQL не может индексировать представления, поэтому то, что вы хотите, невозможно в MySQL.

Вы можете использовать внешний механизм полнотекстового индексирования, такой как Sphinx, и загружать туда данные, используя запрос с JOINS

Кроме того, вы можете создать денормализованную таблицу:

CREATE TABLE ftsearch
        (
        teacherId INT PRIMARY KEY,
        teacherBiography TEXT,
        subject1 TEXT,
        subject2 TEXT,
        subject3 TEXT,
        )
ENGINE=MyISAM

и заполните его следующим запросом:

INSERT
INTO    ftsearch
SELECT  teacherId, teacherBiography,
        s1.name, s2.name, s3.name
FROM    teacherProfile
LEFT JOIN
        subject s1
ON      s1.id = subjectOneId 
LEFT JOIN
        subject s2
ON      s2.id = subjectTwoId 
LEFT JOIN
        subject s3
ON      s3.id = subjectThreeId 

своевременно.

На самом деле, если все ваши таблицы MyISAM, вы можете применять полнотекстовые поисковые запросы (в логическом режиме) к объединению, не создавая полнотекстовый индекс.

Скажем, если вы ищете '+Jones +math +physics', где Jones - фамилия учителя, а math и physics - предметы, вы можете выполнить этот запрос:

SELECT  teacherId, teacherBiography,
        s1.name, s2.name, s3.name
FROM    teacherProfile
LEFT JOIN
        subject s1
ON      s1.id = subjectOneId 
LEFT JOIN
        subject s2
ON      s2.id = subjectTwoId 
LEFT JOIN
        subject s3
ON      s3.id = subjectThreeId 
WHERE   MATCH(teacherBiography) AGAINST ('+Jones' IN BOOLEAN MODE)
        AND MATCH(t.teacherBiography, s1.name, s2.name, s3.name) AGAINST ('+Jones +math +physics' IN BOOLEAN MODE)

MATCH(teacherBiography) AGAINST ('+Jones') будет использовать индекс FULLTEXT для teacher, если есть; второй MATCH отфильтрует результаты.

Запросы, включающие условия OR или сортировку релевантности, являются более сложными.

...