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
のインデックス 、もしあれば; 2番目のMATCH
結果を細かくフィルタリングします。
OR
を含むクエリ ただし、条件または関連性の並べ替えはより複雑です。