php – 使用带有ORM的Sphinx搜索

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

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

为了防止这种情况,我想将Sphinx拖入我们的ORM系统.

有没有人曾经尝试过这个,或者我们可能遇到的任何问题都可以做到这一点?

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

最佳答案 很长时间在这里推动用户最近使用Zend Framework将Sphinx添加到我们的应用程序中.

关于Propel和MVC的注意事项

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

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

你应该采用相同的方法来实现Sphinx搜索.尝试使用扩展的ORM类来抽象它.

关于狮身人面像的注释

>创建视图以简化索引:Sphinx无法与高级子查询一起使用,并且很容易被MySQL函数搞糊涂.尝试抽象您想要索引的数据,以便总SQL与SELECT id,field1,field2,field3 FROM MyView一样简单.当您可能希望将每个Sphinx文档与用户帐户或其他一些非常重要的外键关系相关联时,这尤其有用.
> Sphinx只能索引UINT:在大多数情况下可能是不费脑子的,但你不能使用UUID或负数来解决各种奇怪的数据库结构.
>避免重复的文档ID:在每个Sphinx索引中,每个文档ID必须是唯一的.我们假设您想要使A类对象可搜索,但您希望通过搜索标签,注释和地理位置来查找对象A.使用Sphinx执行此操作的正确方法是使用关于对象的所有元数据创建索引A,并为注释,标记和地理位置创建单独的索引,并确保将属性sql_attr_uint映射回到对象A,然后找出什么在您的代码中检索.
>使用最新版本的Sphinx:Sphinx正处于快速发展阶段,像Debian这样的发行版往往在存储库中有一个非常过时的版本.如果可能并且您有时间确保稳定性,请从源代码编译(Sphinx具有很少的依赖性,因此在大多数情况下它不会成为问题).此外,PHP库代码具有故障安全功能,可防止客户端代码与更新版本的Sphinx搜索守护程序通信.
> Sphinx的范围:执行搜索后,仍然需要从数据库中检索相关信息,因为Sphinx只会为您提供匹配条目的ID.在某些情况下,使用以下内容可能是明智之举:

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

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

点赞