2011-12-30 31 views
3

我是新來的sql數據庫,目前我想做一個數據庫,可以執行T9搜索方法,但我不知道如何做到這一點。任何人都可以指導我呢?在此先感謝如何在sql中執行T9搜索方法?

+0

正如你想實現預測文本?我想你想在內存中使用樹,而不是數據庫 - 我認爲這不會很好地轉化爲SQL。 – Rup 2011-12-30 01:17:58

+0

是的,我想實現預測文本,這意味着使用數據庫本身很難執行T9搜索嗎?感謝您的建議 – Ricky 2011-12-30 01:25:27

+0

我想你只是想要一個表格,列號代表,單詞,單詞優先。因爲如果沒有完全匹配,你想要搜索'234'這樣的數字,那麼你可能需要把這個數字保留一個字符串 - 這對我來說都有點麻煩。 – Rup 2011-12-30 01:33:47

回答

0

在Android中,我使用GLOB進行T9搜索,例如GLOB '[ABC] [DEF] *'

db.rawQuery("SELECT _id, word, freq FROM dicttable WHERE word GLOB '"+searchWord+"*' ORDER BY freq DESC", 
      null); 

希望這可以幫助

+0

我想你要求數據庫做更多的工作 - 你可以事先知道每個單詞的數字是什麼,所以你不需要在運行時做一個通配符匹配。我的擔心是,這將阻止有效使用索引的數據庫。我會檢查這個查詢執行計劃 - 如果它看起來有效率很高,但否則在將系統擴展到大量查找時可能會遇到問題。 – Rup 2012-01-03 09:25:30

0

你應該知道的第一件事,就是LIKE操作,自動完成:

http://www.w3schools.com/sql/sql_like.asp

SQL查詢是不是T9式查詢的最佳方式。

有更高效的數據結構,可以爲這類問題提供可擴展的強大解決方案。 (一個Trie,例如:http://en.wikipedia.org/wiki/Trie

+0

Trie?但是在任何給定的節點都會有許多不同的單詞,所以你需要一些比'只添加這個字母'更復雜的東西,這就是通常的工作方式(至少需要'將這個字母添加到父母單詞X 「)。此外,您還需要在沒有完全匹配的節點上存儲「最佳匹配較長的單詞」,否則您將不得不想出一條遍歷整個子樹的方法來查找並排序它們,而不是像真的一樣。 – Rup 2011-12-30 01:37:01

+0

簡而言之,您需要在數據散列上使用trie。確切的實施需要進一步調查。同時,我提出了一個不太合適的基於SQL的折中方案,但是答案不同。 – 2011-12-30 02:02:42

1

假設你不用擔心效率太高,並且有一個表格包含這種形式的整個字典:Dictionary([id],[hashed],[word])

凡[散列]字段是與它的組符號替換的各字符(例如「A」,「b」,和「c」可與「A」代替)

假設我們有一個'散列'存儲函數,使得散列([word])= [散列]。

然後你就可以簡單地運行此查詢: Select word from Dictionary where [hashed] like (hash(input)+'%')

相關問題