2009-04-10 4 views
0

私は、たとえば画像とその画像に含まれる色の名前を挿入する表があります。色の文字列は、「白、黄、オレンジ、黒」のように見えます。自然検索用のMySQL 50%しきい値の回避策

私はこれらをたくさん持っているので、ほとんどの行に表示されるので、50%のしきい値はいくつかの色を落とし始めています。

表の全体のポイントは、色で検索できることです。誰かが回避策を持っているのですか?それとも、私はちょうどあきらめて、スフィンクスかそれに似たもののために行くべきですか? MySQLの再コンパイルはおそらくオプションではありません。

私は、50%をバイパスするためにテーブルにダミー行を追加する人もいると聞いてきましたが、それはかなり切実です。

答えて

6

これは全文検索で解決することは問題ではありません。

代わりに、イメージごとに色ごとに1行の子テーブルが必要です。

色は、カラーテーブルの外来キーである必要があります。したがって、子テーブルは実際に画像と色の多対多の関係になります。

create table color ( 
id int not null primary key auto_increment, 
name varchar64) 
); 

create table image_color (
    image_id int references image(id), 
    color_id int reference color(id), 
    unique constraint (image_id, color_id) 
) ; 

そして指数関係(及びそれをタプル(image_idは、COLOR_ID)に一意性制約を与える

そして特定の色の画像をすべて検索する:。

select a.* from image a 
join image_color b on (a.id = b.image_id) 
join color c on (b.color_id = c.id) 
where c.name = 'yellow'; 
+0

私が書きたいと思ったものを書くためには、より速い –

2

テーブルの全ポイントは色で検索できるようにすることです。回避策がある人は誰でも

はい、BOOLEAN MODEの検索を使用します。これは、50%のしきい値の影響を受けず、予測も困難です。

しかし、+1をtpdiの答え、私は色をリストする単純な結合テーブルの代わりに全文検索を使用している理由を想像することはできません。単純なyes/noの論理的な記憶上の問題です。単語分割、単語の順序付け、ストップワード、あまりにも短い単語(「赤」はデフォルトでは索引付けされません)の全文の複雑さをドラッグする必要はありません。あなたは厄介な古いMyISAMテーブルを使用して、その機能をまったく手に入れる必要がありません!

フルテキスト検索は一般的に難しく、特にMySQLではうまく実装されていません。それはあなたが本当に選択肢の機能としてではなく、広範囲のテキストで単語を検索する必要があるときのための最後の手段でなければなりません。

+0

ブールモードは基本的に無駄な結果を返します。 –

+0

なぜ彼らは「無価値」ですか?何が間違っているのですか?それは私のためにうまく動作します。 – bobince