在html輸入框中實現服務器端組件的自動完成功能的快速高效的方法是什麼?自動完成服務器端實現
我正在我們的Web界面的主搜索框中寫一個自動完成用戶查詢的服務,並且完成顯示在ajax-powered下拉菜單中。我們正在運行查詢的數據只是一個我們系統知道的大概念表,它大致與維基百科頁面標題集相匹配。對於這項服務,顯然速度是最重要的,因爲網頁的響應對用戶體驗很重要。
當前實現只是將所有概念加載到有序集合的內存中,並對用戶按鍵執行簡單的log(n)查找。然後用尾部組合提供超出最接近匹配的附加匹配。這個解決方案的問題是它不能縮放。它目前正在滿足VM堆空間限制(我已經設置了-Xmx2g,這是我們可以在32位機器上推動的最多的),並且這妨礙了我們擴展概念表或增加更多功能。切換到具有更多內存的計算機上的64位虛擬機不是直接選項。
我一直在猶豫是否開始使用基於磁盤的解決方案,因爲我擔心磁盤尋道時間會導致性能下降。有沒有可能的解決方案可以讓我更好地擴展,無論是內存還是一些快速的磁盤備份實現?
編輯:
@Gandalf:對於我們的使用情況下,重要的是自動完成的是全面的,是不是用戶只需額外的幫助。至於我們正在完成的內容,它是一個概念類型對的列表。例如,可能的條目是[(「Microsoft」,「Software Company」),(「Jeff Atwood」,「Programmer」),(「StackOverflow.com」,「Website」)]。一旦用戶從自動完成列表中選擇一個項目,我們正在使用Lucene進行全面搜索,但我還不確定Lucene對於自動完成本身是否適用。
@Glen:這裏沒有使用數據庫。當我談論一張桌子時,我只是指我的數據的結構化表示。
@Jason Day:我對這個問題的原始實現是使用Trie,但由於需要大量的對象引用,因此內存膨脹實際上比有序集合更差。我會閱讀三元搜索樹,看它是否可以使用。
你能告訴我們一點關於你是什麼「自動完成」維基。爲什麼這麼多條款?是否有更明顯的會滿足用戶查詢的90%,而不是加載所有可能性? – Gandalf 2009-06-09 16:29:38
我無法確定Lucene是否適合您的需求,但是在這個尺寸的數據集上,我非常懷疑您不會在優化的Lucene索引上獲得亞秒查詢時間。根據索引設置的方式,您甚至可以將其存儲在內存中。 – Gandalf 2009-06-09 20:58:08
一個標準的Trie確實是非常強大的內存,對於更大的集合,你想使用一個壓縮的Trie,這大大減少了內存佔用。其他優化包括節點值的延遲初始化和子/值集合的正確數據結構。前一段時間,我創建了一個[Java自動完成庫](https://github.com/fmmfonseca/completely),能夠處理非常大的數據集(10,000,000+),並有效地回答精確和近似的搜索。 – 2015-06-23 14:36:32