From bda69315ff699feb01cf4e0d2d9f7443810517dc Mon Sep 17 00:00:00 2001 From: evazion Date: Mon, 12 Aug 2019 13:38:45 -0500 Subject: [PATCH] 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. --- app/presenters/post_set_presenters/post.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/presenters/post_set_presenters/post.rb b/app/presenters/post_set_presenters/post.rb index 3d001ec5b..1aad52b26 100644 --- a/app/presenters/post_set_presenters/post.rb +++ b/app/presenters/post_set_presenters/post.rb @@ -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)