ThinkingSphinx:关联字段UPDATE不重新索引

时间:2017-06-27 10:08:33

标签: ruby-on-rails thinking-sphinx

thinking-sphinx (3.3.0)

Rails 5.0.4

我在更新关联时遇到了麻烦 - ThinkingSphinx(显然)没有重新索引它们。

MODEL1

class DocRequest < ApplicationRecord
  has_many :doc_responses, :inverse_of => :doc_request, dependent: :destroy
end

MODEL2

class DocResponse < ApplicationRecord
  belongs_to :doc_request, :inverse_of => :doc_responses
end

应用/索引/ 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

当我更新title模型的DocRequest时(在管理区域中),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 - 正常工作。但那肯定不是我需要的。

分贝/ 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附近,但究竟要做什么 - 我不知道。

1 个答案:

答案 0 :(得分:1)

思考当您对模型进行更新时,Sphinx不会自动检测您的关联以及它们与索引数据的关联,因为这可能非常复杂(因此很慢)。 / p>

您已经链接到文档中完全正确的部分,虽然它稍微过时了 - 但您还是希望使用after_commit。每当您进行DocRequest更新时,您都需要为所有关联的DocResponse对象设置delta标志:

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数据是最新的。