2013-02-05 39 views
1

最近我一直在想的是,像imdb或github這樣的站點如何在搜索欄中輸入如此快速的搜索建議。我發現大多數jQuery插件會將數據集轉儲到頁面上,然後在那裏播放。但這不適用於大量的數據庫,因爲它會使頁面重量巨大。我的第一個想法可能是同步ajax調用,但我被告知這可能會導致凍結,直到執行完成。如何從大型數據集中進行搜索建議

問題:如何在輸入表單的同時從大型數據集中拉出記錄,然後顯示結果。

+0

總是它是AJAX。如果不是的話,我很樂於聽到這個消息。 – samayo

+0

良好的索引+緩存 –

+0

研究jQuery的自動完成 - 它有一個源代碼方法,它將aJax調用傳遞給服務器。其他人也存在。祝你好運。 – sgeddes

回答

2

我最近建立這樣的一個常見問題,你面對的2個最大的問題是如下:

  • 數據庫讀取的時間,花費的時間在你的數據庫上運行自己的搜索查詢量
  • 您的通話時間,如果某人在一秒鐘內輸入了3個字符,那麼您在一秒鐘內完成3個ajax通話。

如果它是一個非常基本的搜索第一個問題是沒有這麼大的問題,您可以輕鬆地查詢短小表以毫秒爲單位,但在搜索質量文本它變得緩慢。最好的方式是通過Sphinx或Solr等搜索引擎。他們從您的數據庫索引數據,以便快速查找相關內容。

第二種解決方法是在用戶按鍵筆畫之間有一個小於一秒的休息時間(這取決於您的觀衆的計算機讀寫能力),您不必查看。這意味着只有當他們暫停查找時纔會發生。這意味着更少的查詢和更少的系統壓力。下面的例子:

var typingTimer; 
var doneTypingInterval = 1000; 

$('.huge-input').stop().keyup(function(e){ 
    if ((e.which <= 90 && e.which >= 48) || e.which == 8){ 
     var myHugeInput = $(this); 

     clearTimeout(typingTimer); 
     typingTimer = setTimeout(
     function(){ 
       //Do the look up and set data 
      }, 
      doneTypingInterval 
     ); 
    } 
}); 

所以在這裏我們檢查的輸入框中輸入一個有效的鑰匙進入,我們清除了計時器,然後設定一個超時1000毫秒(1秒),當時間用完它的搜索並設置數據,但是如果在那秒有另一個有效的擊鍵,它清除計時器並重置它。

希望這會有所幫助。

0

我個人非常喜歡Dojo如何解決'數據存儲'問題。也就是說大多數解決方案都可能以jQuery UI的auto complete爲中心。正如所建議的解決方案取決於AJAX請求回到匹配的服務器。這是力學的基礎。通常你需要一些緩存方案,這樣當用戶輸入一個或兩個退格符時,你可以重新使用之前檢索到的結果。現在就速度而言,取決於您搜索的數據集的大小,您可能需要一種索引搜索方法。 Lucene浮現在腦海。或者是一個mongoDB解決方案,將數據構建爲針對搜索優化的內容。

1

下面是我的想法,它可以完成。

我會記錄以前的用戶搜索,並使用某種樹結構來即時記錄當人們開始輸入同樣的東西時人們最終輸入的內容。那麼你只需要在字典中查找,速度似乎不是問題。當然,你需要大量的存儲容量,但我認爲這對大公司來說不是問題。