虽然 Google 及其系列产品几乎无所不能,但是 Web 形式的强大搜索引擎并不能很好地适用于每个站点。如果站点内容已被高度专业化或已明确分类,那就需要使用 Sphinx 和 PHP 来创建一个优化的本地搜索系统。
在 Internet 时代,人们希望信息能够像快餐一样被打包起来:能够快速无障碍使用,并且分为很小的单位(或者是以字节 大小为单位?)。实际上,为了满足急躁而又渴求信息的用户的需求,甚至最普通的 Web 站点现在都要求具有快速浏览样式的各种菜单:
RSS 是比萨快递员,会把新鲜出炉的比萨送上门。
网络日志是当地的中餐馆,为您献上喜爱的风味菜肴。
论坛是家常便饭(或者可能更恰当地说,动物屋 中抢夺食物的场景)。
而搜索就像在当地的餐厅吃自助晚餐一样:不断将想吃的食物填满盘子就行,只要您的食道 还有您的椅子 撑得住。
幸运的是,PHP 开发人员可以找到各种 RSS、blog 和论坛软件来创建或者改进站点。而且,虽然 Google 和其他搜索站点几乎无所不能并且执行过滤通信,但是搜索引擎并不一定会良好地适应各个站点。
例如,如果 Web 站点提供成百上千的全新和翻新的保时捷汽车零件,Google 可能通过诸如 Carrera parts 之类的广义搜索找到您的站点,但是对于更具体的 used 1991 Porsche 911 Targa headlight bezel 查询,它可能不会得到精确结果。
如果站点内容高度专业化,或者访问者期望搜索功能与现实工作流类似,那么最好在 Web 的全局搜索引擎基础上增加一个为您的站点量身定做的本地搜索系统(有关专业化搜索的更多实例,请参阅 A needle in a billion haystacks)。
通过本文了解如何向 PHP 站点中添加一个快速、高效、开源和免费的搜索引擎。本文没有开发可见的 Web 站点。相反,重点讨论交付有效搜索结果所需的组件:数据库、索引、搜索引擎和 PHP 应用程序编程接口 (API)。
访问优秀的 sphinx
要为站点提供自定义搜索功能,您必须有数据源和搜索该数据源的功能。对于 Web 应用程序,数据源通常是一个关系数据库,其中内置了一些搜索功能(Equality 是一个简单的搜索运算符,与 SQL 运算符 LIKE 一样)。但是,一些搜索可能比数据库可以执行的搜索更加具体,或者搜索可能过于复杂,而导致固有的 SQL JOIN 反应迟钝。
海底捞针
许多站点提供特定于某一个行业、职业或者娱乐的内容,例如医药、法律、音乐和汽车维修。深入研究这些内容可能要求使用特殊工具或者培训,或者仅需要使用一个索引来生成相关的实用结果。
下面是一些需要定制搜索系统的常见搜索场景:
查找 Joe Hockey 所撰写的关于斯坦利杯 (Stanley Cup) 的所有文章。
查找 HP LaserJet 3015 All-in-One 打印机的最新驱动程序。
查找 Dinosaur Jr. 参与大卫深夜脱口秀节目的电视片段。
要加速搜索,您可以重新安排表,并由此简化底层查询(表和 SQL 查询优化高度依赖于模式和引擎。可通过在线搜索查找有关数据库性能的各种文章和书籍)。此外,您可以添加一个专门化的搜索引擎。应用哪种形式的搜索引擎还依赖于数据的形式(和数量)和预算。有许多选择可用:您可以将一个 Google 工具连接到您的网络中,购买 Endeca 或其他大型商业搜索产品,或者尝试 Lucene。但是在很多情况下,使用商业产品都有点小题大做,或者浪费运营预算,并且 Lucene 在 2007 年 7 月编写时并未提供 PHP API。
作为一个备选方案,考虑一下 Sphinx,它是一种开源和免费的搜索引擎,可以非常快速地搜索文本。例如,在一个几乎有 300,000 行及五个索引列