使用Sphinx搜索与ORM

时间:2011-12-22 15:01:29

标签: php orm sphinx propel

我正在寻找在我们网站内实施Sphinx搜索。

使用SphinxQL对我进行集成更有意义,而不是必须使用包含新库等做出奇怪的事情,因为这与本机SQL非常接近 。 但是,我担心我们可能最终不得不重新发明轮子,以便我们可以在我们的系统中使用Sphinx。

为了尝试阻止这种情况,我想将Sphinx拖入我们的ORM系统。

以前是否有人尝试过这种方法,或者我们可能会遇到的任何问题都可以做到这一点?

我们目前使用Zend Framework和Propel的混合

1 个答案:

答案 0 :(得分:2)

很长时间在这里推测用户最近使用Zend Framework将Sphinx添加到我们的应用程序中。

有关Propel和MVC的说明

我在过去几个月的发展过程中注意到的是,我希望我能更直接地利用Propel提供的抽象。您可能知道,Propel为ORM创建基类以及只是扩展基类的空类。

目前,许多业务逻辑依赖于单独的模型,而完全相同的逻辑可以简单地实现为扩展的Propel类中的方法。

您应采用相同的方法来实施Sphinx搜索。尝试使用扩展的ORM类来抽象它。

关于Sphinx的说明

  1. 创建视图以简化索引:Sphinx与高级子查询不兼容,很容易被MySQL函数搞糊涂。尝试抽象出要索引的数据,以便总SQL与 SELECT id,field1,field2,field3 FROM MyView 一样简单。当您可能希望将每个Sphinx文档与用户帐户或其他一些非常重要的外键关系相关联时,此功能特别有用。

  2. Sphinx只能索引UINT :在大多数情况下可能不费吹灰之力,但是你不能使用UUID或负数来解决各种奇怪的数据库结构。

  3. 避免重复的文档ID :在每个Sphinx索引中,每个文档ID必须是唯一的。假设您想要使用 A 类型的对象进行搜索,但您希望通过搜索标签,注释和地理位置来查找对象A.使用Sphinx执行此操作的正确方法是使用关于对象的所有元数据创建索引 A ,并为注释,标记和地理位置创建单独的索引,并确保放置属性sql_attr_uint映射回对象A ,然后找出代码中要检索的内容。

  4. 使用最近版本的Sphinx :Sphinx处于快速发展阶段,像Debian这样的发行版在存储库中往往会有一个相当过时的版本。如果可能并且您有时间确保稳定性,请从源代码编译(Sphinx具有很少的依赖性,因此在大多数情况下它不会成为问题)。此外,PHP库代码具有故障安全功能,可防止客户端代码与更新版本的Sphinx搜索守护程序通信。

  5. Sphinx的范围:执行搜索后,您仍需要从数据库中检索相关信息,因为Sphinx只会为您提供匹配条目的ID。在某些情况下,使用类似的东西可能是明智的:

    $ a = AQuery :: create()           - > findByPk(ID_FROM_SPHINX)

    在foreach循环中。但在某些情况下,依靠ORM获取列表可能效率太低,特别是如果您只想列出几列,例如搜索结果。然后,您可以使用自定义优化的SQL选择来获取信息(可以在Propel类中执行)。