mirror of
https://github.com/discourse/discourse.git
synced 2024-12-01 11:45:19 +08:00
86d12bd44b
Also - Significantly improved search ranking, title is treated most strongly - Adds tag names to the index - Run search re-indexer more aggressively - Re-index topic and all posts on category change
108 lines
3.1 KiB
Ruby
108 lines
3.1 KiB
Ruby
module Jobs
|
|
# if locale changes or search algorithm changes we may want to reindex stuff
|
|
class ReindexSearch < Jobs::Scheduled
|
|
every 2.hours
|
|
|
|
def execute(args)
|
|
rebuild_problem_topics
|
|
rebuild_problem_posts
|
|
rebuild_problem_categories
|
|
rebuild_problem_users
|
|
rebuild_problem_tags
|
|
end
|
|
|
|
def rebuild_problem_categories(limit = 500)
|
|
category_ids = load_problem_category_ids(limit)
|
|
|
|
category_ids.each do |id|
|
|
category = Category.find_by(id: id)
|
|
SearchIndexer.index(category, force: true) if category
|
|
end
|
|
end
|
|
|
|
def rebuild_problem_users(limit = 10000)
|
|
user_ids = load_problem_user_ids(limit)
|
|
|
|
user_ids.each do |id|
|
|
user = User.find_by(id: id)
|
|
SearchIndexer.index(user, force: true) if user
|
|
end
|
|
end
|
|
|
|
def rebuild_problem_topics(limit = 10000)
|
|
topic_ids = load_problem_topic_ids(limit)
|
|
|
|
topic_ids.each do |id|
|
|
topic = Topic.find_by(id: id)
|
|
SearchIndexer.index(topic, force: true) if topic
|
|
end
|
|
end
|
|
|
|
def rebuild_problem_posts(limit = 20000)
|
|
post_ids = load_problem_post_ids(limit)
|
|
|
|
post_ids.each do |id|
|
|
# could be deleted while iterating through batch
|
|
if post = Post.find_by(id: id)
|
|
SearchIndexer.index(post, force: true)
|
|
end
|
|
end
|
|
end
|
|
|
|
def rebuild_problem_tags(limit = 10000)
|
|
tag_ids = load_problem_tag_ids(limit)
|
|
|
|
tag_ids.each do |id|
|
|
tag = Tag.find_by(id: id)
|
|
SearchIndexer.index(tag, force: true) if tag
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def load_problem_post_ids(limit)
|
|
Post.joins(:topic)
|
|
.where('posts.id IN (
|
|
SELECT p2.id FROM posts p2
|
|
LEFT JOIN post_search_data pd ON pd.locale = ? AND pd.version = ? AND p2.id = pd.post_id
|
|
WHERE pd.post_id IS NULL
|
|
)', SiteSetting.default_locale, Search::INDEX_VERSION)
|
|
.limit(limit)
|
|
.order('posts.id DESC')
|
|
.pluck(:id)
|
|
end
|
|
|
|
def load_problem_category_ids(limit)
|
|
Category.joins(:category_search_data)
|
|
.where('category_search_data.locale != ?
|
|
OR category_search_data.version != ?', SiteSetting.default_locale, Search::INDEX_VERSION)
|
|
.limit(limit)
|
|
.pluck(:id)
|
|
end
|
|
|
|
def load_problem_topic_ids(limit)
|
|
Topic.joins(:topic_search_data)
|
|
.where('topic_search_data.locale != ?
|
|
OR topic_search_data.version != ?', SiteSetting.default_locale, Search::INDEX_VERSION)
|
|
.limit(limit)
|
|
.pluck(:id)
|
|
end
|
|
|
|
def load_problem_user_ids(limit)
|
|
User.joins(:user_search_data)
|
|
.where('user_search_data.locale != ?
|
|
OR user_search_data.version != ?', SiteSetting.default_locale, Search::INDEX_VERSION)
|
|
.limit(limit)
|
|
.pluck(:id)
|
|
end
|
|
|
|
def load_problem_tag_ids(limit)
|
|
Tag.joins(:tag_search_data)
|
|
.where('tag_search_data.locale != ?
|
|
OR tag_search_data.version != ?', SiteSetting.default_locale, Search::INDEX_VERSION)
|
|
.limit(limit)
|
|
.pluck(:id)
|
|
end
|
|
end
|
|
end
|