0

我正在构建我的第一个 Rails 应用程序,并让它与 Thinking Sphinx 配合使用。我了解其中的大部分内容,但如果有人可以帮助我澄清一些概念性问题,我会很高兴

  1. 在 sphinx 查询后显示搜索结果时,我应该使用从 sphinx 查询返回的 sphinx_attributes 吗?或者我的视图应该使用普通的 rails 对象,例如@property.title、@property.amenities.title 等?如果我使用普通的 rails 对象,这是否意味着它会进行额外的查询?

  2. 在论坛中,我想显示“未读帖子”。显然,对于每个用户/主题组合,这是真/假,所以我想我应该在主题的狮身人面像索引中缓存“读者”ID。这样我可以快速查询给定 user_id 的所有未读帖子。我已经完成了这项工作,但后来意识到它毫无意义,因为狮身人面像索引之间存在时间延迟。因此,如果用户点击未读帖子,它仍然会显示为未读,直到重新索引 sphinx 数据库

  3. 我仍在开发中,所以我正在手动索引/重建,但在生产中,重新索引之间的标准时间是多少?

  4. 我有一个带有多个文本字段的模型 - 我应该将这些都连接到 sphinx 索引中的一列中以进行关键字搜索吗?当然,这比索引所有单独的字段要快。

  5. 有点离题,但只是想知道 - 当您访问嵌套模型时,例如 @property.agents.name,这会影响性能吗?或者当从数据库中提取属性时,rails 是否会自动获取所有关联的条目?

4

1 回答 1

1

要回答您的每个观点:

  1. 对于您的两个示例,sphinx_attributes都没有帮助。首先,您已经加载了属性,因此标题可以直接使用,无需额外的数据库访问。因为property.amenities.title您正在处理 Sphinx 没有概念的字符串数组。一般来说,我只会将 sphinx_attributes 用于复杂的计算属性,而不是标准的列引用。

  2. 是的,你是对的,这个值会有延迟。

  3. 这取决于您的数据更改的频率。我有一些应用程序可以每天索引,因为更改非常罕见,但其他应用程序我们将每 10 分钟运行一次。如果数据特别不稳定,我将考虑使用增量(通常通过 Sidekiq)在几秒钟内将更改反映在 Sphinx 中。

  4. 我认为这两种方式都没有太大区别-除非您想单独搜索这些列中的任何一个?如果是这样,它需要是一个单独的字段。

  5. 默认情况下,当您使用每个属性的代理时,该属性的代理将从数据库中加载(每个属性一个 SQL 调用)。您可以查看急切加载文档,了解如何在处理多条记录时更好地管理它。Thinking Sphinx有能力:include选项传递给底层的 ActiveRecord 调用。

于 2013-06-25T02:06:50.007 回答