MySQL
kan geen weergaven indexeren, dus wat je wilt is onmogelijk in MySQL
.
U kunt een externe fulltext-indexeringsengine zoals Sphinx gebruiken en daar gegevens laden met behulp van een query met JOINS
U kunt ook een gedenormaliseerde tabel maken:
CREATE TABLE ftsearch
(
teacherId INT PRIMARY KEY,
teacherBiography TEXT,
subject1 TEXT,
subject2 TEXT,
subject3 TEXT,
)
ENGINE=MyISAM
en vul het met deze vraag:
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
op tijd.
Eigenlijk, als al uw tabellen MyISAM
zijn , kunt u zoekopdrachten met volledige tekst (in booleaanse modus) toepassen op een join, zonder dat u een volledige tekstindex hoeft te maken.
Zeg, als je zoekt naar '+Jones +math +physics'
, waar Jones
is de achternaam van een leraar en math
en physics
onderwerpen zijn, kunt u deze zoekopdracht uitvoeren:
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)
De MATCH(teacherBiography) AGAINST ('+Jones')
zal een FULLTEXT
. gebruiken index op teacher
, indien van toepassing; de tweede MATCH
zal de resultaten fijnfilteren.
Vragen met betrekking tot de OR
voorwaarden of het sorteren op relevantie zijn echter complexer.