2010-01-28 70 views
4

拉起與輸入到搜索欄中的字符匹配的項目的祕訣是什麼?例如,如果我在搜索欄中鍵入字母「W」,則將立即返回短語中任何字符位置包含字母「W」的所有短語。核心數據查詢緩慢

因此,如果20,000個短語的數據庫包含500個字母爲「W」的短語,則只要用戶鍵入第一個字符,就會顯示它們。然後,隨着附加字符的輸入,列表會自動縮短。

我可以從iPhone向SQL服務器發送查詢並獲得此類響應,但是,無論我們嘗試採取其他用戶的建議,我們仍然無法獲得良好的響應時間數據庫本地在iPhone上。

我知道這個性能是可用的,因爲還有很多其他應用程序在您開始輸入時就會顯示結果。

請注意,這與索引每個短語中的所有單詞不同,因爲這隻會在單詞以輸入的字符開始時顯示匹配。在這種情況下,我們正在查找單詞內的字符。

+0

你現在正在嘗試什麼方法?您是否在提取請求上設置批量大小? – gerry3 2010-01-29 02:37:23

回答

0

如果你願意擺脫這個數據庫,你可以使用一個廣義後綴樹與你的短語中的所有術語。您可以在線性時間內構建後綴樹,並且我相信可以使用它快速查找所有出現的子字符串。網頁上有很多關於後綴樹和後綴數組的頁面。維基百科可能是一個很好的開始。

0

我對你有一個有趣的計劃。您可以通過32位整數構建每個短語中存在的字符的索引。翻轉位[0-25]以表示短語中存在的字符(不區分大小寫)的a-z。構建查詢字符串的第二個位圖。現在您可以通過按位運算(&和|)進行比較以確定匹配。這非常快,並且相信SQLite實際上不支持查詢中的按位操作,因此您甚至可以使用此方案直接訪問數據庫。我有工作代碼,這是內置於我們的iPhone應用程序之一 - Alphagram。

+0

我假設Al想要搜索子字符串,而不是一組字符的個別存在,這就是位掩碼操作聽起來像它會做的事情。我猜測,一旦用戶鍵入'W',如果他們跟着它'e'它應該匹配'怪異',但現在'在哪裏'。 – VictorB 2010-02-05 09:25:20

+0

我不確定他的解釋。在Alphagram中,我使用位掩碼作爲初始過濾器,並對過濾結果進行第二次傳遞以確定是否存在完全匹配。 – xyzzycoder 2010-02-05 21:18:46

1

我認爲異步結果過濾是答案。每次用戶鍵入一個新字符時,都不要更新搜索結果,而應在輸入第一個字符時將db查詢放在後臺線程上。如果在查詢完成之前鍵入了新字符,請取消舊查詢並開始一個新查詢。最後,您將到達用戶停止輸入足夠長的時間以便查詢返回。這樣,查詢本身永遠不會阻止用戶的輸入。

我相信UISearchDisplayController類提供了這種類型的異步搜索,不管你想使用那個類還是僅僅採用異步設計模式取決於你。