2012-12-18 56 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编写。它管理源代码的索引,并且速度很快(以我的经验)。它支持许多查询类型,搜索字段,搜索排名。