From 650da7b626aeb71fc344dee3f608187c3b99e4b0 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Mon, 9 Nov 2020 13:35:37 +0800 Subject: [PATCH] PERF: Update index for category in a background job. Search indexing can get expensive and there is no need for us to block the entire request just to wait for index to finish. --- app/jobs/regular/index_category_for_search.rb | 10 ++++++++++ app/models/category.rb | 9 ++++----- app/services/search_indexer.rb | 1 + spec/components/search_spec.rb | 1 + 4 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 app/jobs/regular/index_category_for_search.rb diff --git a/app/jobs/regular/index_category_for_search.rb b/app/jobs/regular/index_category_for_search.rb new file mode 100644 index 0000000000..396e95320f --- /dev/null +++ b/app/jobs/regular/index_category_for_search.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +class Jobs::IndexCategoryForSearch < Jobs::Base + def execute(args) + category = Category.find_by(id: args[:category_id]) + raise Discourse::InvalidParameters.new(:category_id) if category.blank? + + SearchIndexer.index(category, force: args[:force] || false) + end +end diff --git a/app/models/category.rb b/app/models/category.rb index 2623b153de..8f2a481239 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -778,11 +778,10 @@ class Category < ActiveRecord::Base end def index_search - if saved_change_to_attribute?(:name) - SearchIndexer.queue_category_posts_reindex(self.id) - end - - SearchIndexer.index(self) + Jobs.enqueue(:index_category_for_search, + category_id: self.id, + force: saved_change_to_attribute?(:name), + ) end def update_reviewables diff --git a/app/services/search_indexer.rb b/app/services/search_indexer.rb index 93a4c7bc6b..12bdcbc4aa 100644 --- a/app/services/search_indexer.rb +++ b/app/services/search_indexer.rb @@ -243,6 +243,7 @@ class SearchIndexer end if Category === obj && (obj.saved_change_to_name? || force) + SearchIndexer.queue_category_posts_reindex(obj.id) SearchIndexer.update_categories_index(obj.id, obj.name) end diff --git a/spec/components/search_spec.rb b/spec/components/search_spec.rb index 7e9b0cb797..236f562e5b 100644 --- a/spec/components/search_spec.rb +++ b/spec/components/search_spec.rb @@ -8,6 +8,7 @@ describe Search do before do SearchIndexer.enable + Jobs.run_immediately! end context 'post indexing' do