ThinkingSphinx:关联字段更新不重建索引
ThinkingSphinx: association field UPDATE does not reindex
thinking-sphinx (3.3.0)
Rails 5.0.4
我在更新关联时遇到问题 - ThinkingSphinx(显然)不会重新索引它们。
模型1
class DocRequest < ApplicationRecord
has_many :doc_responses, :inverse_of => :doc_request, dependent: :destroy
end
模型2
class DocResponse < ApplicationRecord
belongs_to :doc_request, :inverse_of => :doc_responses
end
app/indices/doc_response_index.rb
ThinkingSphinx::Index.define :doc_response, :with => :active_record, :delta => true do
indexes doc_request.title, :as => :doc_request_title, :sortable => true
indexes text
has doc_request_id
end
控制器:
result = DocResponse.search @keyword
当我更新 DocRequest
模型的 title
时(在管理区域),ThinkingSphinx 显然不会重新索引 doc_request.title
字段,例如result = DocResponse.search @keyword
查询没有改变。
怎么了?
运行 rake ts:rebuild
解决问题。但我不能在每次更新时都这样做。
我尝试添加一个
ThinkingSphinx::Index.define :doc_request, :with => :active_record, :delta => true do
indexes title
end
索引然后直接执行 result = DocRequest.search @keyword
- 它 工作正常 。但这肯定不是我需要的。
db/schema.rb
create_table "doc_requests", force: :cascade do |t|
t.string "title"
t.text "text"
t.boolean "paid"
t.integer "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.boolean "delta", default: true, null: false
t.index ["user_id"], name: "index_doc_requests_on_user_id", using: :btree
end
create_table "doc_responses", force: :cascade do |t|
t.boolean "chosen"
t.text "text"
t.float "price"
t.integer "user_id"
t.integer "doc_request_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.boolean "delta", default: true, null: false
t.index ["doc_request_id"], name: "index_doc_responses_on_doc_request_id", using: :btree
t.index ["user_id"], name: "index_doc_responses_on_user_id", using: :btree
end
我做错了什么?我需要一些帮助。
我可以在 ThinkingSphinx 中启用一些详细的控制台模式 - 以在更新时查看重建索引事件吗?这可能对调试有用。
我想答案就在这个附近http://freelancing-gods.com/thinking-sphinx/deltas.html#deltas-and-associations,但具体要做什么 - 我不知道。
每当您对模型进行更新时,Thinking Sphinx 不会自动检测您的关联以及它们与索引数据的关系,因为这可能 非常 复杂(因此, 慢).
您已链接到文档中完全正确的部分,尽管它有点过时了 - 您需要改用 after_commit
。每当您更新 DocRequest 时,您都需要为所有关联的 DocResponse 对象设置增量标志:
class DocRequest < ActiveRecord::Base
# ...
after_commit :set_response_delta_flags
# ...
private
def set_response_delta_flags
doc_responses.each { |response|
response.update_attributes :delta => true
}
end
# ...
end
更新每个响应将触发受影响响应对象的增量处理,这反过来将确保它们的 Sphinx 数据是最新的。
thinking-sphinx (3.3.0)
Rails 5.0.4
我在更新关联时遇到问题 - ThinkingSphinx(显然)不会重新索引它们。
模型1
class DocRequest < ApplicationRecord
has_many :doc_responses, :inverse_of => :doc_request, dependent: :destroy
end
模型2
class DocResponse < ApplicationRecord
belongs_to :doc_request, :inverse_of => :doc_responses
end
app/indices/doc_response_index.rb
ThinkingSphinx::Index.define :doc_response, :with => :active_record, :delta => true do
indexes doc_request.title, :as => :doc_request_title, :sortable => true
indexes text
has doc_request_id
end
控制器:
result = DocResponse.search @keyword
当我更新 DocRequest
模型的 title
时(在管理区域),ThinkingSphinx 显然不会重新索引 doc_request.title
字段,例如result = DocResponse.search @keyword
查询没有改变。
怎么了?
运行 rake ts:rebuild
解决问题。但我不能在每次更新时都这样做。
我尝试添加一个
ThinkingSphinx::Index.define :doc_request, :with => :active_record, :delta => true do
indexes title
end
索引然后直接执行 result = DocRequest.search @keyword
- 它 工作正常 。但这肯定不是我需要的。
db/schema.rb
create_table "doc_requests", force: :cascade do |t|
t.string "title"
t.text "text"
t.boolean "paid"
t.integer "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.boolean "delta", default: true, null: false
t.index ["user_id"], name: "index_doc_requests_on_user_id", using: :btree
end
create_table "doc_responses", force: :cascade do |t|
t.boolean "chosen"
t.text "text"
t.float "price"
t.integer "user_id"
t.integer "doc_request_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.boolean "delta", default: true, null: false
t.index ["doc_request_id"], name: "index_doc_responses_on_doc_request_id", using: :btree
t.index ["user_id"], name: "index_doc_responses_on_user_id", using: :btree
end
我做错了什么?我需要一些帮助。
我可以在 ThinkingSphinx 中启用一些详细的控制台模式 - 以在更新时查看重建索引事件吗?这可能对调试有用。
我想答案就在这个附近http://freelancing-gods.com/thinking-sphinx/deltas.html#deltas-and-associations,但具体要做什么 - 我不知道。
每当您对模型进行更新时,Thinking Sphinx 不会自动检测您的关联以及它们与索引数据的关系,因为这可能 非常 复杂(因此, 慢).
您已链接到文档中完全正确的部分,尽管它有点过时了 - 您需要改用 after_commit
。每当您更新 DocRequest 时,您都需要为所有关联的 DocResponse 对象设置增量标志:
class DocRequest < ActiveRecord::Base
# ...
after_commit :set_response_delta_flags
# ...
private
def set_response_delta_flags
doc_responses.each { |response|
response.update_attributes :delta => true
}
end
# ...
end
更新每个响应将触发受影响响应对象的增量处理,这反过来将确保它们的 Sphinx 数据是最新的。