search: optimize related tag calc in multi-tag searches (#4120).
In multi-tag searches, we calculated the tags in the sidebar by sampling 300 random posts from within the search and finding the most frequently used tags. This meant we were effectively doing two searches on every page load, one for the actual search and one for the sidebar. This is not so bad for fast searches, but very bad for slow searches. Instead, now we calculate the related tags from the current page of results. This is much faster, at the cost of slightly lower accuracy and the tag list changing slightly as you browse between pages. We could use caching here, which would help when browsing between pages, but we would still have to calculate the tags on the first page load, which can be very slow in the worst case.
This commit is contained in:
@@ -29,7 +29,7 @@ module PostSetPresenters
|
||||
elsif Tag.has_metatag?(post_set.tag_array, *Tag::SUBQUERY_METATAGS)
|
||||
calculate_related_tags_from_post_set
|
||||
else
|
||||
related_tags_for_group
|
||||
calculate_related_tags_from_post_set
|
||||
end
|
||||
end
|
||||
|
||||
@@ -46,7 +46,10 @@ module PostSetPresenters
|
||||
end
|
||||
|
||||
def related_tags_for_group
|
||||
RelatedTagCalculator.calculate_from_sample_to_array(post_set.tag_string).map(&:first)
|
||||
normalized_tags = Tag.normalize_query(post_set.tag_string, normalize_aliases: false)
|
||||
Cache.get("PostSetPresenters::Post#related_tags_for_group(#{normalized_tags})", 5.minutes) do
|
||||
RelatedTagCalculator.calculate_from_sample_to_array(normalized_tags).map(&:first)
|
||||
end
|
||||
end
|
||||
|
||||
def related_tags_for_single(tag_string)
|
||||
|
||||
Reference in New Issue
Block a user