MySQL
kann Ansichten nicht indizieren, also ist das, was Sie wollen, in MySQL
unmöglich .
Sie können eine externe Volltext-Indizierungsmaschine wie Sphinx verwenden und dort Daten über eine Abfrage mit JOINS
laden
Alternativ können Sie eine denormalisierte Tabelle erstellen:
CREATE TABLE ftsearch
(
teacherId INT PRIMARY KEY,
teacherBiography TEXT,
subject1 TEXT,
subject2 TEXT,
subject3 TEXT,
)
ENGINE=MyISAM
und füllen Sie es mit dieser Abfrage:
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
rechtzeitig.
Eigentlich, wenn alle Ihre Tabellen MyISAM
sind können Sie Volltextsuchabfragen (im booleschen Modus) auf einen Join anwenden, ohne einen Volltextindex erstellen zu müssen.
Angenommen, Sie suchen nach '+Jones +math +physics'
, wobei Jones
ist der Nachname eines Lehrers und math
und physics
Themen sind, können Sie diese Abfrage durchführen:
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)
Der MATCH(teacherBiography) AGAINST ('+Jones')
verwendet einen FULLTEXT
Index auf teacher
, wenn überhaupt; das zweite MATCH
wird die Ergebnisse fein filtern.
Abfragen mit OR
Bedingungen oder Sortierung nach Relevanz sind jedoch komplexer.