1

嗨我正在建立一個使用自動建議的表單。它的工作方式是將大約2萬多個客戶加入我的angularjs應用程序。然後,當用戶在輸入字段中鍵入要查找的客戶名稱時,我只會顯示與用戶輸入的客戶相匹配的客戶。每次用戶輸入字符時,查找函數$ scope.search1_autosuggest()都會運行再次。自動建議20,000條目

我想知道如果我這樣做的方式是有效的或沒有?由於它是一大組數據,我想確保速度足夠快以進行自我暗示。

controller.js

$scope.search1_autosuggest=function(type){ 
     var results=$scope.original_data; 
     var new_results=[]; 
    if(type=="phone"){ 

    var typed_result=$scope.search1.phone; 

     for (var key in results) { 
      var phone_result = results[key].home_phone; 

      if(phone_result.match(typed_result)){ 
       new_results.push(results[key]); 
      } 
     } 
     $scope.info=new_results; 


    } 

}; 

partial.html

<form> 
    Phone: <input type="text" data-ng-model="search1.phone" data-ng- 
change="search1_autosuggest('phone')"/><br/> 
    Name: <input type="text" data-ng-model="search1.name" data-ng-  
change="search1_autosuggest('name')"/><br/> 
    Address: <input type="text" data-ng-model="search1.address" data-ng- 
change="search1_autosuggest('address')"/><br/> 
</form> 
<h3>Customers</h3> 
<div> 
    <ul> 
     <li data-ng-repeat="field in info"> 
      <a href="" data-ng-click="retrieve_single(field.id)"> name:{{field.name}}.  
    address:{{field.address}}. Phone:{{field.home_phone}}.</a> 
     </li> 
    </ul> 
    </div> 
+0

數據庫引擎如何有效地查詢海量數據(遠遠超過20,000個項目)?他們使用*索引*。當你獲取數據時,你應該創建一個索引。我認爲爲此也有一些很好的客戶端數據庫。你也應該限制你的結果來減少迭代次數。 –

+0

如果您確定排序數據,則二分查找會將您從O(n)移動到O(log n)。如果你走這條路線,你可能想把電話,姓名和地址分成單獨的表格,這樣他們就可以被分類(可能將表格與索引鏈接起來) – KayakDave

回答

2

等待字符輸入之間的小時間延遲(某處0.4 - 0.6秒效果很好)。當計時器到期時,執行查找。這似乎對用戶沒有錘擊查詢的響應。

使用在關鍵事件中重置的計時器。

+0

FWIW這通常被稱爲「debouncing」。 – alxndr

1

最近我這樣做的方式是等到用戶鍵入至少幾個字符,然後我做異步調用來檢索匹配的記錄。這樣,減少了等待時間的量,同時在頁面加載

我也把計時器在keyup事件,以便它不會嘗試解決每個按鍵

1

這是一個很大的數據集。根據其他信息(地理位置,時間範圍等)對數據集執行的任何預過濾都將極大地有所幫助。我們利用郵政數據庫(免費提供)使用郵政編碼來限制哪些城市可供選擇,城市和郵政編碼限制哪些街道可供選擇,城市和郵政編碼以及街道限制哪些地址可供選擇(例如,知道只有2070至3400主街可能匹配)。

任何您可以執行的數據預索引也將有所幫助。儘可能避免在交互時間內進行線性搜索。你可能想要把你的名單分成更小的塊 - 按照Jasonscript的建議,把前幾個字符分爲桶,以便將問題簡化爲更易於管理的問題。

還記得,你不必一次就完成所有的比賽。您可以獲取適合屏幕的內容,顯示它們,繼續將剩下的內容作爲後臺任務獲取,如果有新的搜索條件可用,則中斷任務將被中斷。正如其他人所指出的那樣,這隱藏了用戶的一些延遲。 (許多網站都是這樣做的;例如,BoingBoing最初只獲取有限數量的條目,然後在向下滾動時認爲需要它們時抓取更多。)

確保您的數據是當前的和乾淨,如果這將是客戶而不是你自己的員工可見。你想要的最後一件事是讓他們滾動瀏覽「法利,查爾斯休」或類似的測試條目。

玩得開心。當你得到這個權利,它真的留下深刻印象的用戶。