FIX: Better ordering of similar user search suggestions (#20142)

* FIX: Better ordering of similar user search suggestions
This commit is contained in:
Rafael dos Santos Silva 2023-02-02 14:39:44 -03:00 committed by GitHub
parent 14cf8eacf1
commit e4fd3d9850
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 13 deletions

View File

@ -173,24 +173,19 @@ class UserSearch
return users.to_a if users.size >= @limit
if SiteSetting.user_search_similar_results
# 6. similar usernames
if @term.present?
# 6. similar usernames / names
if @term.present? && SiteSetting.user_search_similar_results
if SiteSetting.enable_names?
scoped_users
.where("username_lower <-> ? < 1", @term)
.order(["username_lower <-> ? ASC", @term])
.where("username_lower <-> ? < 1 OR name <-> ? < 1", @term, @term)
.order(["LEAST(username_lower <-> ?, name <-> ?) ASC", @term, @term])
.limit(@limit - users.size)
.pluck(:id)
.each { |id| users << id }
end
return users.to_a if users.size >= @limit
# 7. similar names
if SiteSetting.enable_names? && @term.present?
else
scoped_users
.where("name <-> ? < 1", @term)
.order(["name <-> ? ASC", @term])
.where("username_lower <-> ? < 1", @term)
.order(["username_lower <-> ? ASC", @term])
.limit(@limit - users.size)
.pluck(:id)
.each { |id| users << id }

View File

@ -274,6 +274,7 @@ RSpec.describe UserSearch do
codinghorror = Fabricate(:user, username: "codinghorror", name: "Jeff Atwood")
pfaffman = Fabricate(:user, username: "pfaffman")
zogstrip = Fabricate(:user, username: "zogstrip", name: "Régis Hanol")
roman = Fabricate(:user, username: "roman", name: "Roman Rizzi")
SiteSetting.user_search_similar_results = false
expect(UserSearch.new("rafel").search).to be_blank
@ -297,5 +298,13 @@ RSpec.describe UserSearch do
expect(UserSearch.new("regis").search).to include(zogstrip)
expect(UserSearch.new("reg").search).to include(zogstrip)
end
it "orders the results by similarity" do
zogstrip = Fabricate(:user, username: "zogstrip", name: "Régis Hanol")
roman = Fabricate(:user, username: "roman", name: "Roman Rizzi")
SiteSetting.user_search_similar_results = true
expect(UserSearch.new("regis").search.first).to eq(zogstrip)
end
end
end