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
или сортировку релевантности, являются более сложными.