我有一个包含2个关联的频道模型,“内容”和“订阅”。
在频道索引中,用户可以按订阅数量或已批准内容的数量订购频道。
在开发过程中,一切似乎都能正常工作(通过观察结果,可能出现故障并且数据不足以正确看待它),在分期中结果是随机的,有时会正确显示,有时候不要吨。
起初我没有使用delta索引,并认为问题可能存在,所以每当我批准我打电话的内容时:
Delayed::Job.enqueue(DelayedRake.new("ts:index"), queue: "sphinx")
由于订阅没有索引,我每次创建索引时都不会重新索引(我应该这样做吗?)
然后我开始在频道中使用delta索引,我仍然遇到同样的问题:
ThinkingSphinx::Index.define :channel, with: :active_record, delta: true do
# fields
indexes :name, sortable: true
indexes description
# attributes
has created_at, sortable: true
has approved, type: :boolean
has public, type: :boolean
join subscriptions
has "COUNT(subscriptions.id)", as: :subscription_count, type: :integer, sortable: true
join contents.approved
has "COUNT(contents.id)", as: :content_count, type: :integer, sortable: true
end
这是控制器中的搜索呼叫:
def index
if params[:order_by].present?
@channels = Channel.search params[:search],
order: "#{params[:order_by]} DESC",
page: params[:page], per_page: 6
else
@channels = Channel.search params[:search],
order: :name,
page: params[:page], per_page: 6
end
end
总结一下,我的问题是: 1.我的渠道索引是否形成良好? 2.订阅也应该是索引,还是足以将它们加入我的频道索引? 3.在我创建订阅/批准内容或渠道中的增量索引后,我是否应该运行reindex,因为我在频道索引中加入了这两个控制器?
答案 0 :(得分:1)
您的索引看起来很好,但如果您正在使用增量(我认为这是最明智的方法,让数据保持最新),那么您希望在订阅时触发相关渠道的增量内容已创建/编辑/删除。这在the documentation中有所介绍(请参阅“Deltas和Associations”部分),但您在Subscription和Content中都会看到类似的内容:
after_save :set_channel_delta_flag
after_destroy :set_channel_delta_flag
# ...
private
def set_channel_delta_flag
channel.update_attributes :delta => true
end
鉴于您正在使用延迟作业,我建议调查ts-delayed-delta
以确保在您的正常HTTP请求流中发生增量更新。我强烈建议不要在每次更改后运行完整索引 - 这可能会很快变得非常慢(并且不必要地增加服务器负载)。