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')
を使用します。2つ目は、結果を細かくフィルタリングします。FULLTEXT
teacher
MATCH
ただし、条件または関連性の並べ替えを含むクエリOR
はより複雑です。