【问题标题】:ThinkingSphinx: association field UPDATE does not reindexThinkingSphinx:关联字段 UPDATE 不会重新索引
【发布时间】:2017-06-27 10:08:32
【问题描述】:
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

index 然后直接执行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 附近,但具体该怎么做 - 我不知道。

【问题讨论】:

    标签: ruby-on-rails thinking-sphinx


    【解决方案1】:

    Thinking Sphinx 不会在您更新模型时自动检测您的关联以及它们与您的索引数据的关系,因为这可能会非常复杂(因此很慢)。

    您已链接到文档中完全正确的部分,尽管它有点过时 - 您需要改用 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 数据是最新的。

    【讨论】:

    • 谢谢,它有效。但我注意到另一个问题:为什么当我使用搜索关键字“tested”时,我得到的结果包括“test”这个词?这是错误的,我想摆脱它。
    • 您是否设置了词干/形态?这可能就是原因。
    • 开发:&generic mem_limit:128M enable_star:1 min_infix_len:3 形态:stem_enru charset_table:“0..9, A..Z->a..z, _, @, a..z , U+410..U+42F->U+430..U+44F, U+430..U+44F, U+401->U+451, U+451" max_matches: 100000 per_page: 100000 charset_type: "utf-8" expand_keywords: 1 生产:
    • 是的,morphology 设置可以匹配相似的词(测试/测试/测试等)。如果您不希望发生这种情况,则应删除该设置并重建。
    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2012-10-12
    相关资源
    最近更新 更多