2

私は自分のデータベースにテキストファイルをロードしていて、組織の名前をリストするテーブルと、テキストファイルとそれらの組織との潜在的な一致を保持するテーブルとの間でいくつかのクイックマッチングを実行しようとしています。

を使用してファイルをロードしましたLOAD INFILE CONCURRENTが、問題はありません。

ひねりは、生のテキストテーブル()で照合しようとしているフィールドに、occupationoraffiliation組織名だけではないという事実から来ています。LIKEしたがって、文字列を一致させるためにワイルドカードを 使用しようとしています。

テキストを一致させるために、私はこのクエリを使用しようとしています:

UPDATE raw_faca JOIN orgs AS o
    ON raw_faca.org_id IS NULL AND raw_faca.occupationoraffiliation LIKE CONCAT('%',o.org_name,'%')
SET raw_faca.org_id = o.org_id;

私もなしで試しましたCONCAT

UPDATE raw_faca JOIN orgs AS o
    ON raw_faca.org_id IS NULL AND raw_faca.occupationoraffiliation LIKE ('%' + o.org_name + '%')
SET raw_faca.org_id = o.org_id;

テーブルにはraw_faca約40,000行があり、orgsテーブルには約20,000行があります。すべてのクエリにインデックスがあります。クエリは数時間ほど実行されています。これは、操作には長すぎるようです。私が実行しようとしている比較は、それだけ非効率的ですか、それともここで見事に愚かなことをしていますか?私は、外部のphpまたはpythonスクリプトを1行ずつ使用しないようにしたいと考えていました。

の使用に関する以下のコメントに応えてMatch . . . Against、私は次のクエリも試しました。

UPDATE raw_faca JOIN orgs AS o ON raw_faca.org_id IS NULL AND MATCH(raw_faca.occupationoraffiliation) AGAINST (o.org_name IN NATURAL LANGUAGE MODE)
SET raw_faca.org_id = o.org_id; 

そしてそれは私にこのエラーを与えています:

incorrect arguments to AGAINST

何かご意見は?

4

1 に答える 1

3

先頭にワイルド カードがあるLIKE句では、インデックスを利用できません。

于 2011-05-24T19:58:58.917 に答える