4

這個問題很簡單。使Web應用程序的客戶端的自動完成功能非常簡單。有很多插件。在服務器中實現AutoComplete的最佳方式是什麼?

但是,在背後,在服務器端,最好的方法是什麼?我不喜歡這個想法,每個用戶都有一個按鍵。

我一直在想獅身人面像,或一些全文搜索引擎從你的網站並行運行。

例如,如果我有一個PHP(高流量)的網站,我可以創建一個並行python腳本,從我的「自動填充文本框」獲取http請求。然後,當用戶在客戶端按下某個鍵時,AJAX請求會被引導到可以使用特殊策略的那個python腳本。

你的問題是什麼?

一些約定:

  • 儘量不要打DB。我的意思是,獲得 的請求並做一些事情SELECT * FROM foo WHERE bar LIKE「req%」不是 的一個很好的答案。這可能是一個很好的策略,但我知道該怎麼做。*
  • 複製數據可能是一個不錯的選擇。
+0

您似乎對服務器端可用的語言和技術有一些沒有說明的假設。如果你想陳述他們,那麼給出一個切實的答覆會更容易。 – bmargulies 2010-11-06 21:59:31

+0

這組候選字符串有多大?用什麼標準對它們進行排名(即對每個人,每個用戶甚至是每個請求標準都是一樣的)? – 2010-11-06 22:01:51

+0

@bmargulies我正在努力關注建築。但是,作爲指導。「搜索框架」(例如Lucene,Sphinx,Memcache等)可以是任何可以安裝在Linux服務器上的東西。然後,關於語言,如果它是一個廣泛採用的框架,它會有庫,但可以考慮使用良好的語言:Java,Phython,PHP。 – santiagobasulto 2010-11-06 22:43:55

回答

8

我同意你需要有一些更好的解決方案。 Apache solr有一個「建議」功能,你可以很好地使用。如果你的數據集很小,那麼把所有的數據放在內存中,只做一個簡單的循環。

在前端,我建議在觸發ajax調用之前使用setTimeout()等待大約200ms。如果在200ms內觸發另一次擊鍵,則取消上次超時並開始另一次。這是一個非常乾淨的解決方案,它不會在每次擊鍵時擊中數據庫。我過去使用過它,它運行得非常好。

這解釋了與jquery solr和如何創建一個自動完成很好。 http://www.mattweber.org/2009/05/02/solr-autosuggest-with-termscomponent-and-jquery/

+0

這是我以前用過的一篇文章http://www.sematext.com/products/autocomplete/index.html – 2010-11-06 22:12:29

+0

真的真的(循環1000次)很棒。非常感謝你。我會看看。 – santiagobasulto 2010-11-06 22:28:25

0

您在評論中說「這是關鍵詞的小數據集」。因此,一旦用戶開始在字段中輸入內容,讓客戶端請求整個列表可能是合適的,然後讓JavaScript響應客戶端上用戶輸入的更改。

這是每個頁面每個字段命中一個服務器(並且只有當用戶在字段中輸入時),並且可以將其緩存在服務器上,因此很少必須擊中數據庫。

編輯:緩存在服務器上是一個很大的勝利,因爲該列表是爲每個請求,併爲所有用戶是相同的,但更重要的,這意味着你可以通過使用Expires或緩存在客戶端的瀏覽器列表Etag標題在響應中具有合適的時間段。因此,用戶可以在瀏覽器緩存的整個時間段內只訪問一個(高速緩存的)服務器,從而獲得無限制的自動完成功能。

+0

是的,我想過。但這不可擴展。我的意思是,如果將來發生變化,我無法繼續在客戶端加載所有數據。無論如何,感謝 – santiagobasulto 2010-11-07 12:27:20

+1

@santiago,同時考慮可擴展性可能很重要,對已知的現在進行優化比爲未知的未來優化更有意義:)另外我會爭辯說它在一定程度上是可擴展的;如果列表變得足夠大,開始請求所有匹配第一個字母的關鍵字,也許後面是前兩個字母等等。考慮到每個請求的開銷很大,您可能還需要一個可用的大量列表,而不是點擊服務器每當用戶暫停鍵入一秒鐘。 – 2010-11-07 13:49:35

相關問題