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
(如果有);第二个MATCH
将精细过滤结果。
然而,涉及OR
条件或相关性排序的查询更为复杂。