使用带有 ORM 的 Sphinx 搜索
Posted
技术标签:
【中文标题】使用带有 ORM 的 Sphinx 搜索【英文标题】:Using Sphinx Search with an ORM 【发布时间】:2011-12-22 15:01:29 【问题描述】:我正在考虑在我们的网站中实施 Sphinx 搜索。
与其做一些奇怪的事情,包括新的库等,对我来说使用 SphinxQL 集成它更有意义,因为这非常接近原生 SQL . 但是,我担心我们最终可能不得不重新发明***,以便我们可以在我们的系统中使用 Sphinx。
为了防止这种情况发生,我想将 Sphinx 拖到我们的 ORM 系统中。
以前有没有人尝试过,或者任何人都可以解决我们可能遇到的问题?
我们目前混合使用 Zend Framework 和 Propel
【问题讨论】:
如果你不确定如何使用它,那你为什么要使用它呢?我问这个是因为从你的问题来看,a)你想做什么并b)你没有给出一个可以更好地解释你运行的问题的具体例子。 【参考方案1】:在这里长期推动最近使用 Zend 框架将 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 类型的对象可搜索,但您想通过搜索标签、cmets 和地理位置来找到对象 A。使用 Sphinx 执行此操作的正确方法是创建一个索引 A,其中包含有关对象的所有元数据以及 cmets、标签和地理位置的单独索引,并确保您 放置一个属性 sql_attr_uint映射回对象 A,然后找出要在代码中检索的内容。
使用最新版本的 Sphinx:Sphinx 正在快速开发中,像 Debian 这样的发行版往往在存储库中有相当过时的版本。如果可能并且您有时间确保稳定性,请从源代码编译(Sphinx 几乎没有依赖项,因此在大多数情况下不会有问题)。此外,php 库代码具有故障保护功能,可防止客户端代码与过时版本的 Sphinx 搜索守护进程通信。
Sphinx 的范围:执行搜索后,您仍然需要从数据库中检索相关信息,因为 Sphinx 只会为您提供匹配条目的 ID。在某些情况下,使用以下内容可能是明智的:
$a = AQuery::create() ->findByPk(ID_FROM_SPHINX)
在 foreach 循环中。但在某些情况下,依靠 ORM 来获取列表可能效率太低,特别是如果您只想列出几列,例如搜索结果。然后,您可以改为使用自定义优化的 SQL 选择来获取信息(可以在 Propel 类中进行)。
【讨论】:
以上是关于使用带有 ORM 的 Sphinx 搜索的主要内容,如果未能解决你的问题,请参考以下文章