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] )

したがって、括弧内のこれらの最後の3つのフィールドは存在しませんが、それらに対してテキスト検索を実行したいのですが、外部キー制約を設定する必要がありますか(既存のシステムにさらに影響を与える場合は、設定しないでください)。または私ができるもっと雄弁な何かがありますか?

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は教師の名前でありmathphysicsは科目です。次のクエリを実行できます。

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つ目は、結果を細かくフィルタリングします。FULLTEXTteacherMATCH

ただし、条件または関連性の並べ替えを含むクエリORはより複雑です。

于 2010-10-05T15:57:02.167 に答える