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')
将使用
teacher
上的
FULLTEXT
索引(如果有的话);第二个
MATCH
将对结果进行精细过滤。
然而,涉及
OR
条件或相关性排序的查询则更加复杂。