2012-12-18 58 views
1

我將向網站添加簡單的實時搜索(在輸入框中輸入文本時提示)。定製實時搜索任務的最佳解決方案

主要任務是:

  • 39K純文本線搜索到(〜500長度每行,4Mb的總規模)
  • 1K在線用戶可以同時在輸入框
  • 輸入的東西在某些情況下, 2K-3K resuts可以匹配用戶請求

我擔心以下問題:

  • 數據庫VS文本文件?
  • 是否有任何與我的任務相關的一般規則或最佳實踐旨在降低db /服務器內存負載? (緩存/索引/等)
  • Sphinx/Solr是否適合這樣的任務?

任何鏈接/建議將非常有幫助。

謝謝

P.S.可能是這是最好的解決方案? PHP to search within txt file and echo the whole line

+0

看看這個我張貼了一陣子http://stackoverflow.com/a/13830962/1880925 –

回答

1

我已經實施了多次「實時搜索」,總是使用AJAX查詢數據庫(MySQL),並且還沒有/觀察到任何速度或大負載問題。

無論如何,我看到一個使用Solr的實現,但不能建議它是否更快或消耗更少的資源。

它完全取決於服務器將運行的HW,IMO。正如我在某處寫的,我曾經看到過一個文件系統非常慢的服務器,因此在查詢和解析txt文件(或使用Solr)時,實施實時搜索可能比查詢數據庫時慢。另一方面,您可以使用緩慢的數據庫連接來承載較差的共享主機(這會在更多併發連接時變得更慢),因此這不是最佳解決方案。

我的建議是:使用MySQL AJAX(看this jquery pluginthis article),在搜索欄設置適當INDEX ES,如果這個發現速度慢,您仍然可以移動到一個txt文件。

2

把你的數據庫中的數據(SQLite應該做的很好,但你也可以使用更重型RDBMS像MySQLPostgres),並把一個指數將要搜索的一列或多列。

只做最低限度,這意味着你不應該使用框架,ORM等,他們只會減慢你的代碼。

創建一個PHP文件,搶在搜索文本,並使用本地PHP驅動程序,如SQLiteMySQLiPDO或類似做SELECT查詢。

另外,請考慮搜索框是如何工作的。例如,你可以防止許多請求。設置最小字符數限制(僅搜索一個或兩個字符是沒有意義的),在發送請求之間放置一個短暫的延遲(以便您不發送從未使用的請求)等等。

是否使用擴展名如Solr取決於您的情況。如果你有很多數據和很多請求,那麼也許你應該研究它。但如果問題可以通過一個簡單的解決方案來解決,那麼你應該在使它變得更加複雜之前嘗試一下。

+0

謝謝!關於推遲請求也是一個有趣的想法。得到它了 –

1

在過去,我用Zend search Lucene取得了巨大的成功。

它是一個通用的文本搜索引擎,完全用PHP 5編寫。它管理源代碼的索引,並且速度很快(以我的經驗)。它支持許多查詢類型,搜索字段,搜索排名。