2009-04-10 85 views
0

我有一張表格,用於插入圖像以及在所述圖像中找到的顏色名稱。顏色字符串看起來像「白色,黃色,橙色,黑色」。針對MySQL 50%自然搜索閾值的解決方法

由於我有很多這些,50%的閾值開始減少一些顏色,因爲它們出現在大多數行上。

表的全部要點是能夠按顏色進行搜索。有沒有人有解決方法,或者我應該放棄並去獅身人面像或類似的東西?重新編譯MySQL可能不是一種選擇。

我聽說有些人只是在表中添加虛擬行來繞過50%,但這聽起來非常絕望。

回答

6

這不是全文搜索需要解決的問題。

相反,您需要一個子表,每個圖像的每個顏色一行。

顏色應該是顏色表的外鍵,所以您的子表實際上會變成圖像和顏色之間的多對多關係。

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

+1寫我想寫的東西,只有更快 – 2009-04-10 21:17:00

2

該表的全部要點是能夠通過顏色進行搜索。是否有人有解決方法

是的,使用BOOLEAN MODE搜索,這些搜索不受50%閾值的影響,且不易預測。

但是,+1 tpdi的答案,我無法想象爲什麼你使用全文搜索,而不是簡單的連接表列出的顏色。這是一個簡單的是/否邏輯存儲問題,不需要拖動全文複雜的分詞,單詞排序,停用詞,太短的單詞(「紅色」不會被默認索引),最重要的是事實你必須使用令人討厭的舊MyISAM表來獲得該功能!

全文搜索一般很難,在MySQL中沒有特別好的實現。當你確實需要搜索大量文本中的單詞時,而不是作爲選擇的特徵,這應該是你最後的選擇。

+0

布爾模式返回基本上毫無價值的結果。 – 2009-04-11 06:04:21

相關問題