2012-11-04 25 views
1

我正在開發一個基本的詞搜索應用與SQL和紅寶石,我有一個字母數組來找到可用的單詞。通過縮小哪些字母不在數組中,查詢更容易。例如。返回字符數爲?的行嗎?

alphabet= %w{a b c d e f g h i j k l m n o p q r s t u v w x y z} 

available_letters = %w{p k z l p m t l n g g r u a r t n d z w a l m n e} 

然後我就可以從字母表中減去,信件從我的搜索中排除,並用一個SQL查詢類似下面的結束。

select * from words 
where word not like '%b%' and word not like '%c%' and word not like '%f%'..... 

這給了我所有可用的單詞與所有可用字母的組合。它不會縮小字母出現的次數。所以如果我只有一個「E」,我希望查詢能夠縮小隻包含一個e的詞。我不確定這是否可以用sql查詢完成,或者我是否需要使用一個過程。任何人都知道解決這個問題的好方法嗎?

+0

你有沒有想過創建一個 - 26列(我知道這聽起來很糟糕) - 表的字母數可用?然後,你所要做的就是:'SELECT * FROM words WHERE e = 1' - 這將是海拉更快的方式 –

+0

我想你可以創建一個由word_id,letter_id,count ......填充的聯結表「填充的,p」的條目在計數列中將包含2,而「填充的,e」將具有1的計數(該字中的其他字符也是如此)。這樣的表格每個詞將有n個詞條,該詞中每個不同的字母都有一個詞條。 (填充將在交叉點/計數表中有8個條目)。 這將爲50K作品提供大約50萬個作品,每個作品平均包含10個不同的字符。聽起來有點醜陋,但它有效地交換了預計算和空間,以便進行快速標準化查找。 –

回答

0

您可能想要更快速地實現此目的,但要回答您的問題,您可以使用not like '%e%e%'排除具有多個「e」的單詞。

+0

什麼是一些更快的方法? – ctilley79

+0

我喜歡你對問題的評論中的建議。您也可以考慮將查詢分解爲一堆只查看單詞開頭的查詢,如果數據庫具有基於樹的索引,這可能會更快。 – histocrat

相關問題