使用带有ORM的Sphinx搜索


Using Sphinx Search with an ORM

我正在考虑在我们的网站中实现Sphinx搜索。

而不是做一些奇怪的事情,包括新的库等,使用SphinxQL集成它对我来说更有意义,因为这相当接近本地SQL.然而,我担心我们最终可能不得不重新发明轮子,以便我们可以在我们的系统中使用Sphinx。

为了防止这种情况,我想把Sphinx拖到我们的ORM系统中。

以前有人尝试过这个吗,或者有人知道我们可能会遇到的问题吗?

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

最近使用Zend框架将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:在大多数情况下可能是不需要动动大脑的,但是您不能使用uid或负数来处理各种奇怪的数据库结构。

  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类中完成)。