2017-12-04 122 views
8

Khi tôi cố gắng lập lại các bản ghi từ bên trong một mô hình, nó sẽ kết thúc thiết lập một chỉ mục trống trên máy chủ elasticsearch.Chỉ mục tìm kiếm trống rỗng sau khi tái lập từ mô hình

Vì vậy, tôi có một mô hình Course có nhiều Instructors. Bây giờ, tôi có phương thức gọi lại này bên trong mô hình instructor.rb cố gắng reindex bất cứ khi nào một cái gì đó được cập nhật trên Instructor.

class Instructor < ActiveRecord::Base 
belongs_to :teacher, :class_name => "User", :foreign_key => "user_id" 
belongs_to :instructorable, polymorphic: true 
after_commit :reindex_course 

private 

    def reindex_course 
    Course.reindex_course 
    end 
end 

course.rb mô hình trông như thế này:

class Course < ActiveRecord::Base 
     has_many :instructors, as: :instructorable, dependent: :destroy 

searchkick word_start: [ :name, :description, :instructor_name] 

def search_data 
     { 
     name: name, 
     description: description, 
     searchable: searchable, 
     }.merge(
     instructor_name: instructors.includes(:teacher).pluck(:'users.name').reject(&:nil?), 
     institute_id: creator.try(:institute_id) 
) 
      def self.reindex_course 
       index = Course.reindex(async: true, refresh_interval: "5s") 
       Course.search_index.promote(index[:index_name], update_refresh_interval: true) 
       Course.search_index.clean_indices 
       end 
    end 

Tạo một Instructor mới dẫn đến reindexing hồ sơ

Instructor.create(user_id: 4009,instructorable_id: 4792, instructorable_type:"ScheduledCourse") 
    ETHON: performed EASY effective_url=http://xx:[email protected]/elasticsearch/_aliases response_code=200 return_code=ok total_time=0.630504 
    ETHON: performed EASY effective_url=http://xx:[email protected]/elasticsearch/courses_development_20171204162604885 response_code=200 return_code=ok total_time=0.922072 
    ETHON: performed EASY effective_url=http://xx:[email protected]/elasticsearch/_alias/courses_development response_code=200 return_code=ok total_time=0.29790799999999995 
     (5.0ms) SELECT MIN("courses"."id") FROM "courses" LEFT OUTER JOIN "users" ON "users"."id" = "courses"."creator_id" LEFT OUTER JOIN "units" ON "units"."course_id" = "courses"."id" LEFT OUTER JOIN "instructors" ON "instructors"."instructorable_id" = "courses"."id" AND "instructors"."instructorable_type" = $1 [["instructorable_type", "Course"]] 
     (4.4ms) SELECT MAX("courses"."id") FROM "courses" LEFT OUTER JOIN "users" ON "users"."id" = "courses"."creator_id" LEFT OUTER JOIN "units" ON "units"."course_id" = "courses"."id" LEFT OUTER JOIN "instructors" ON "instructors"."instructorable_id" = "courses"."id" AND "instructors"."instructorable_type" = $1 [["instructorable_type", "Course"]] 
    Enqueued Searchkick::BulkReindexJob (Job ID: d710eff3-5e39-4347-b02a-5459bfd4b1be) to Sidekiq(searchkick) with arguments: {:class_name=>"Course", :index_name=>"courses_development_20171204162604885", :batch_id=>1, :min_id=>2, :max_id=>1001} 
    Enqueued Searchkick::BulkReindexJob (Job ID: f0bf5866-f3da-42dd-9132-2de23735fbf4) to Sidekiq(searchkick) with arguments: {:class_name=>"Course", :index_name=>"courses_development_20171204162604885", :batch_id=>2, :min_id=>1002, :max_id=>2001} 
    Enqueued Searchkick::BulkReindexJob (Job ID: 348e07b8-a85a-4a9f-a2f2-d2b70416d2bf) to Sidekiq(searchkick) with arguments: {:class_name=>"Course", :index_name=>"courses_development_20171204162604885", :batch_id=>3, :min_id=>2002, :max_id=>3001} 
    Enqueued Searchkick::BulkReindexJob (Job ID: e40f2a33-e2f7-4f77-9416-920d84e285e7) to Sidekiq(searchkick) with arguments: {:class_name=>"Course", :index_name=>"courses_development_20171204162604885", :batch_id=>4, :min_id=>3002, :max_id=>4001} 
    Enqueued Searchkick::BulkReindexJob (Job ID: 18b357c1-cd53-4836-8aaf-4c97dde56281) to Sidekiq(searchkick) with arguments: {:class_name=>"Course", :index_name=>"courses_development_20171204162604885", :batch_id=>5, :min_id=>4002, :max_id=>5001} 
    ETHON: performed EASY effective_url=http://xx:[email protected]/elasticsearch/courses_development_20171204162604885/_settings response_code=200 return_code=ok total_time=0.372641 
    ETHON: performed EASY effective_url=http://xx:[email protected]/elasticsearch/_alias/courses_development response_code=200 return_code=ok total_time=0.333225 
    ETHON: performed EASY effective_url=http://xx:[email protected]/elasticsearch/_aliases response_code=200 return_code=ok total_time=0.42405099999999996 
    ETHON: performed EASY effective_url=http://xx:[email protected]/elasticsearch/_aliases response_code=200 return_code=ok total_time=0.382619 
    ETHON: performed EASY effective_url=http://xx:[email protected]/elasticsearch/courses_development_20171204162504480 response_code=200 return_code=ok total_time=0.408705 

Bây giờ khi tôi chạy truy vấn này:

Searchkick.search search_params[:search], operator: "or", 
      index_name: [Course], 
      where:{institute_id: institute_id, searchable: true}, 
      fields: ['name^100','instructor_name^100','description^50'], 
      match: :word_start, misspellings: {edit_distance: 2}, 
      page: search_params[:page],per_page: 20, 
      order: {_score: :desc} 

Tôi nhận được một em pty phản ứng:

ETHON: performed EASY effective_url=http://xx:[email protected]/elasticsearch/courses_development/_search response_code=200 return_code=ok total_time=0.733799 
    Search (738.0ms) curl http://xx.xxx.xx.xxx:80/courses_development/_search?pretty -d '{"query":{"bool":{"must":{"dis_max":{"queries":[{"bool":{"must":{"bool":{"should":[{"match":{"name.word_start":{"query":"Elasticsearch","boost":1000.0,"operator":"or","analyzer":"searchkick_word_search"}}},{"match":{"name.word_start":{"query":"Elasticsearch","boost":100.0,"operator":"or","analyzer":"searchkick_word_search","fuzziness":2,"prefix_length":0,"max_expansions":3,"fuzzy_transpositions":true}}}]}},"should":{"match":{"name.analyzed":{"query":"Elasticsearch","boost":1000.0,"operator":"or","analyzer":"searchkick_word_search"}}}}},{"bool":{"must":{"bool":{"should":[{"match":{"instructor_name.word_start":{"query":"Elasticsearch","boost":1000.0,"operator":"or","analyzer":"searchkick_word_search"}}},{"match":{"instructor_name.word_start":{"query":"Elasticsearch","boost":100.0,"operator":"or","analyzer":"searchkick_word_search","fuzziness":2,"prefix_length":0,"max_expansions":3,"fuzzy_transpositions":true}}}]}},"should":{"match":{"instructor_name.analyzed":{"query":"Elasticsearch","boost":1000.0,"operator":"or","analyzer":"searchkick_word_search"}}}}},{"bool":{"must":{"bool":{"should":[{"match":{"description.word_start":{"query":"Elasticsearch","boost":500.0,"operator":"or","analyzer":"searchkick_word_search"}}},{"match":{"description.word_start":{"query":"Elasticsearch","boost":50.0,"operator":"or","analyzer":"searchkick_word_search","fuzziness":2,"prefix_length":0,"max_expansions":3,"fuzzy_transpositions":true}}}]}},"should":{"match":{"description.analyzed":{"query":"Elasticsearch","boost":500.0,"operator":"or","analyzer":"searchkick_word_search"}}}}}]}},"filter":[{"term":{"institute_id":113}},{"term":{"searchable":true}}]}},"size":1000,"from":0,"timeout":"11s","_source":false}' 
=> #<Searchkick::Results:0x007fcb8c9cb378 
@klass=nil, 
@options= 
    {:page=>1, 
    :per_page=>1000, 
    :padding=>0, 
    :load=>true, 
    :includes=>nil, 
    :model_includes=>nil, 
    :json=>false, 
    :match_suffix=>:word_start, 
    :highlighted_fields=>[], 
    :misspellings=>true}, 
@response= 
    {"took"=>1, 
    "timed_out"=>false, 
    "_shards"=>{"total"=>5, "successful"=>5, "skipped"=>0, "failed"=>0}, 
    "hits"=>{"total"=>0, "max_score"=>nil, "hits"=>[]}}> 

Tuy nhiên, khi tôi chạy Course.reindex (từ giao diện điều khiển hoặc mô hình) hoặc thiết bị đầu cuối RAILS_ENV=development bundle exec rake searchkick:reindex CLASS=Course --trace hình thức nó một lần nữa bắt đầu làm việc.

[33] pry(main)> Searchkick.search "Elasticsearch", operator: "or",index_name: [Course],where:{institute_id: 113, searchable: true},fields: ['name^100','instructor_name^100','description^50'],match: :word_start,misspellings: {edit_distance: 2} 
ETHON: performed EASY effective_url=http://xx:[email protected]/elasticsearch/courses_development/_search response_code=200 return_code=ok total_time=0.57072 
    Search (573.5ms) curl http://xxx.xx.xx.xxx:80/courses_development/_search?pretty -d '{"query":{"bool":{"must":{"dis_max":{"queries":[{"bool":{"must":{"bool":{"should":[{"match":{"name.word_start":{"query":"Elasticsearch","boost":1000.0,"operator":"or","analyzer":"searchkick_word_search"}}},{"match":{"name.word_start":{"query":"Elasticsearch","boost":100.0,"operator":"or","analyzer":"searchkick_word_search","fuzziness":2,"prefix_length":0,"max_expansions":3,"fuzzy_transpositions":true}}}]}},"should":{"match":{"name.analyzed":{"query":"Elasticsearch","boost":1000.0,"operator":"or","analyzer":"searchkick_word_search"}}}}},{"bool":{"must":{"bool":{"should":[{"match":{"instructor_name.word_start":{"query":"Elasticsearch","boost":1000.0,"operator":"or","analyzer":"searchkick_word_search"}}},{"match":{"instructor_name.word_start":{"query":"Elasticsearch","boost":100.0,"operator":"or","analyzer":"searchkick_word_search","fuzziness":2,"prefix_length":0,"max_expansions":3,"fuzzy_transpositions":true}}}]}},"should":{"match":{"instructor_name.analyzed":{"query":"Elasticsearch","boost":1000.0,"operator":"or","analyzer":"searchkick_word_search"}}}}},{"bool":{"must":{"bool":{"should":[{"match":{"description.word_start":{"query":"Elasticsearch","boost":500.0,"operator":"or","analyzer":"searchkick_word_search"}}},{"match":{"description.word_start":{"query":"Elasticsearch","boost":50.0,"operator":"or","analyzer":"searchkick_word_search","fuzziness":2,"prefix_length":0,"max_expansions":3,"fuzzy_transpositions":true}}}]}},"should":{"match":{"description.analyzed":{"query":"Elasticsearch","boost":500.0,"operator":"or","analyzer":"searchkick_word_search"}}}}}]}},"filter":[{"term":{"institute_id":113}}]}},"size":1000,"from":0,"timeout":"11s","_source":false}' 
=> #<Searchkick::Results:0x007fcb8f2893a0 
@klass=nil, 
@options= 
    {:page=>1, 
    :per_page=>1000, 
    :padding=>0, 
    :load=>true, 
    :includes=>nil, 
    :model_includes=>nil, 
    :json=>false, 
    :match_suffix=>:word_start, 
    :highlighted_fields=>[], 
    :misspellings=>true}, 
@response= 
    {"took"=>32, 
    "timed_out"=>false, 
    "_shards"=>{"total"=>5, "successful"=>5, "skipped"=>0, "failed"=>0}, 
    "hits"=> 
    {"total"=>2, 
    "max_score"=>19030.512, 
    "hits"=> 
     [{"_index"=>"courses_development_20171204170257200", 
     "_type"=>"course", 
     "_id"=>"4792", 
     "_score"=>19030.512}, 
     {"_index"=>"courses_development_20171204170257200", 
     "_type"=>"course", 
     "_id"=>"4782", 
     "_score"=>14400.825}]}}> 

Trả lời

1
 def self.reindex_course 
      index = Course.reindex(async: true, refresh_interval: "5s") 
      Course.search_index.promote(index[:index_name], update_refresh_interval: true) 
      Course.search_index.clean_indices 
      end 

Hình như gọi Course.search_index.clean_indices trong dòng cuối cùng sẽ làm sạch các chỉ số cũ. Tôi nghĩ rằng bạn có thể muốn gọi nó trong dòng đầu tiên, hoặc không gọi nó cả.

+0

cảm ơn phản hồi nhưng ngay cả khi tôi không gọi nó là gì cả, nó sẽ mang lại kết quả trống. tự hỏi có gì sai ở đây. – Abhinay

+0

Truy vấn được tạo từ bảng điều khiển không có 'có thể tìm kiếm: đúng' trong đó. –

+0

Điều này có thể được đơn giản hóa bằng cách thực hiện phương thức 'should_index?', Giống như 'def should_index? có thể tìm kiếm kết thúc'. sau đó bạn bỏ qua 'có thể tìm kiếm: true' trong search_data và truy vấn. –

1

Tôi đã tìm thấy bản sửa lỗi nhanh cho vấn đề này. gọi số touch trên bố mẹ (Course) lớp Instructor và mô hình được liên kết khác dường như đang cập nhật chỉ mục một cách chính xác.

instructor.rb mô hình trông như thế này:

: 
: 
: 
after_commit :reindex_course 
: 
: 
def reindex_course 
    if self.try(:instructorable).try(:persisted?) 
     if self.instructorable_type == "Course" 
     self.instructorable.touch 
     elsif self.instructorable_type == "ScheduledCourse" 
     self.instructorable.course.touch 
     end 
    end 
    end 

Như móc hoạt động chính xác khi có điều gì xảy ra trên Course mô hình, touch dường như được giải quyết mục đích cho bây giờ.

Trả lời cho vấn đề vẫn còn là một bí ẩn đối với tôi.

Các vấn đề liên quan