2011-12-22 125 views
4

我正在寻找在我们的网站内实施Sphinx搜索。使用Sphinx搜索ORM

与使用新库等做奇怪的事情不同,使用SphinxQL进行集成对我来说更有意义,因为它非常接近原生SQL 。但是,我担心我们可能最终不得不重新发明轮子,以便我们可以在系统中使用Sphinx。

为了防止这种情况发生,我想将狮身人面像拖入我们的ORM系统。

有没有人试过这个,或者任何人可以遇到的问题,我们可能会遇到这样做?

我们目前使用Zend框架的结构与行走

+0

如果您不确定如何使用它,那么为什么要使用它呢?我问这个问题是因为从你的问题来看,它不是很清楚a)你想做什么,b)你没有给出一个具体的例子,可以更好地解释你运行的问题。 – hakre 2011-12-24 00:15:23

回答

2

长时间行走的用户在这里谁最近添加到狮身人面像使用Zend Framework应用程序了。在行走和MVC

我在发展,过去几个月已经注意到

注意的是,我想我已经采取了抽象的Propel提供了更直接的优势。正如你可能知道的那样,Propel为ORM创建基类,以及仅仅扩展基类的空类。

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

你应该采用相同的方法来实现Sphinx搜索。尝试使用扩展的ORM类来抽象它。在狮身人面像

  1. 说明创建视图,以简化索引:斯芬克斯不会有先进的子查询踢好容易被通过MySQL的函数混淆。尝试抽象您想要索引的数据,以便总SQL像一样简单SELECT id,field1,field2,field3 FROM MyView。如果您想要将每个Sphinx文档与用户帐户或其他外部关键字关联在一起,这非常有用。

  2. 狮身人面像也只能索引UINT:可能是一个没有脑子在大多数情况下,但你不能使用的UUID或负数来解决各种奇怪的数据库结构。

  3. 避免重复的文档ID:在每个Sphinx索引中,每个文档ID必须是唯一的。让我们假设你想让A类型的对象可搜索,但是你想通过搜索标签,评论和地理位置来找到对象A.使用Sphinx做到这一点的正确方法是使索引A与关于对象的所有元数据以及注释,标记和地理位置的单独索引进行比较,并确保将属性sql_attr_uint映射回对象A,然后找出在你的代码中检索什么。

  4. 使用最近的狮身人面像的版本:狮身人面像正在快速发展,如Debian发行版往往有在仓库一个非常过时的版本。如果可能并且您有时间来确保稳定性,请从源代码进行编译(Sphinx几乎没有依赖关系,因此在大多数情况下它不会成为问题)。此外,PHP库代码具有故障保险功能,可防止客户端代码与最新版本的Sphinx搜索守护进程交谈。

  5. 狮身人面像的程度:你已经完成搜索后,你仍然需要从数据库中检索相关信息,因为狮身人面像只会给你匹配的条目的ID。在某些情况下,它可能是明智的使用类似:

    $ A = AQuery ::创建() - > findByPk(ID_FROM_SPHINX)

    在foreach循环

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