3

我正在尝试向系统添加全文搜索。我要编写的查询需要涉及多个查找,然后是搜索(如果可能的话)。

我有一张教师表和一张科目表。

teacherProfile
teacherId [int] - primary key
subjectOneId [int]
subjectTwoId [int]
subjectThreeId [int]
teacherBiography [text]

subjects
subjectId [int]
subjectName [text]

所以最终我想要一个结果集......

teacherId [int]
teacherBiography [text]
( subjectOneName [text] )
( subjectTwoName [text] )
( subjectThreeName [text] )

所以括号中的最后三个字段不存在,但我确实想对它们执行文本搜索,我是否需要设置外键约束(如果对现有系统有进一步影响,我不想这样做)还是我能做一些更有说服力的事情?

4

1 回答 1

2

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条件或相关性排序的查询更为复杂。

于 2010-10-05T15:57:02.167 回答