summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorHaelwenn <contact+git.pleroma.social@hacktivis.me>2020-07-10 08:49:14 +0000
committerHaelwenn <contact+git.pleroma.social@hacktivis.me>2020-07-10 08:49:14 +0000
commit5ea638757210c34b40fb568e537082b78f4118a6 (patch)
tree6635ffb2117ec4765969484cb437d7f1f7ea1e79 /lib
parent8743df5193018238eff730447519300b271cd592 (diff)
parent123352ffa1c80aab658fca0c2276d1c06de43a02 (diff)
downloadpleroma-5ea638757210c34b40fb568e537082b78f4118a6.tar.gz
pleroma-5ea638757210c34b40fb568e537082b78f4118a6.zip
Merge branch 'user-search-nickname-rank-boost' into 'develop'
Improved search results for localized nickname match See merge request pleroma/pleroma!2733
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/user/search.ex18
1 files changed, 15 insertions, 3 deletions
diff --git a/lib/pleroma/user/search.ex b/lib/pleroma/user/search.ex
index 42ff1de78..d4fd31069 100644
--- a/lib/pleroma/user/search.ex
+++ b/lib/pleroma/user/search.ex
@@ -69,11 +69,15 @@ defmodule Pleroma.User.Search do
u in query,
where:
fragment(
+ # The fragment must _exactly_ match `users_fts_index`, otherwise the index won't work
"""
- (to_tsvector('simple', ?) || to_tsvector('simple', ?)) @@ to_tsquery('simple', ?)
+ (
+ setweight(to_tsvector('simple', regexp_replace(?, '\\W', ' ', 'g')), 'A') ||
+ setweight(to_tsvector('simple', regexp_replace(coalesce(?, ''), '\\W', ' ', 'g')), 'B')
+ ) @@ to_tsquery('simple', ?)
""",
- u.name,
u.nickname,
+ u.name,
^query_string
)
)
@@ -88,15 +92,23 @@ defmodule Pleroma.User.Search do
|> Enum.join(" | ")
end
+ # Considers nickname match, localized nickname match, name match; preferences nickname match
defp trigram_rank(query, query_string) do
from(
u in query,
select_merge: %{
search_rank:
fragment(
- "similarity(?, trim(? || ' ' || coalesce(?, '')))",
+ """
+ similarity(?, ?) +
+ similarity(?, regexp_replace(?, '@.+', '')) +
+ similarity(?, trim(coalesce(?, '')))
+ """,
^query_string,
u.nickname,
+ ^query_string,
+ u.nickname,
+ ^query_string,
u.name
)
}