进行自定义网站搜索的方法

时间:2011-02-24 12:26:37

标签: php mysql full-text-search

我正在创建一个包含许多不同部分的社交网站,例如博客,画廊,多媒体等。现在是实现搜索功能的时候了。客户拒绝使用谷歌搜索并坚持制作自定义搜索,其中每个部分都会单独显示结果。

例如,如果用户输入“art”,结果应显示如下:

3 found in blogs
1 ...
2 ...
3 ...

2 found in galleries
1 ...
2 ...

None found in multimedia

我打算使用MySQL全文搜索。所以,问题是:我如何进行这样的搜索,所以如果很多记录与查询匹配,它不会杀死服务器?在这种情况下,我真的没有看到如何实现分页。

6 个答案:

答案 0 :(得分:4)

我强烈建议不要使用MySQL进行全文搜索,在索引创建和执行搜索方面都很慢。

看看SphinxLucene,它们都比MySQL快得多,而且很容易绑定到PHP应用程序。

答案 1 :(得分:2)

你不会用这样的东西杀死一个mysql服务器,即使你的应用程序很庞大(我们在这里谈论数千个查询/秒),你只需要设置一个专用于搜索的mysql服务器的复制品,你可能想要建立一个“热门关键词结果”的缓存来加快速度,但是像googlemini这样的设备仍然是最好的......

答案 2 :(得分:2)

如果您可以运行Java servlet容器(如Tomcat或Jetty),那么我建议使用Solr(http://lucene.apache.org/solr/)。它位于Lucene之上,非常强大。 Solr在CNET开始,被Netflix和Zappos等大型网站使用。 Stack Overflow使用Lucene的.NET实现。我对Sphinx并不熟悉,所以我不能告诉你它与Solr的比较。

如果您使用Solr,请查看刻面。这允许您执行搜索,然后计算“博客”,“画廊”,“多媒体”等中有多少文档。

这是一个与Solr(http://code.google.com/p/solr-php-client/)接口的PHP客户端。

答案 3 :(得分:1)

也许更好的决定是使用 - sphinx

答案 4 :(得分:1)

我之前在我创建的一些网站上做过这个。我所做的是对每个模块运行一个查询以查找结果。你想要做的是运行一个mysql查询,然后在while循环中获取行而不是使用fetch all。这样可以确保不会过度消耗内存。

例如:     while($ row = mysql_fetch_array($ result)){echo $ row ['item_name']; }

您很可能会发现MySQL可以处理比您想象的更大的搜索。

分页最好使用分页类,例如来自代码点火器等的分页类。 你在使用网络框架吗?

答案 5 :(得分:1)

是Sphinx或Lucene,两者都比MySQL好,速度快,而且很容易绑定到PHP应用程序。