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