Ensure exact match is the first result in hashtag searches (#21315)

Fixes #17494
This commit is contained in:
Claire 2022-12-15 18:41:40 +01:00 committed by GitHub
parent 7fbc17afa2
commit bf1c7e2122
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 17 additions and 1 deletions

View File

@ -76,11 +76,27 @@ class TagSearchService < BaseService
definition = TagsIndex.query(query) definition = TagsIndex.query(query)
definition = definition.filter(filter) if @options[:exclude_unreviewed] definition = definition.filter(filter) if @options[:exclude_unreviewed]
definition.limit(@limit).offset(@offset).objects.compact ensure_exact_match(definition.limit(@limit).offset(@offset).objects.compact)
rescue Faraday::ConnectionFailed, Parslet::ParseFailed rescue Faraday::ConnectionFailed, Parslet::ParseFailed
nil nil
end end
# Since the ElasticSearch Query doesn't guarantee the exact match will be the
# first result or that it will even be returned, patch the results accordingly
def ensure_exact_match(results)
return results unless @offset.nil? || @offset.zero?
normalized_query = Tag.normalize(@query)
exact_match = results.find { |tag| tag.name.downcase == normalized_query }
exact_match ||= Tag.find_normalized(normalized_query)
unless exact_match.nil?
results.delete(exact_match)
results = [exact_match] + results
end
results
end
def from_database def from_database
Tag.search_for(@query, @limit, @offset, @options) Tag.search_for(@query, @limit, @offset, @options)
end end