Merge branch 'issue/2036-part-2' into 'develop'
[akkoma] / lib / pleroma / user / search.ex
index 42ff1de786dd3a9675a2c9871f3905fcdd38719d..d4fd310690e33f0c7d691f02e90aeb5ebac79ffd 100644 (file)
@@ -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
           )
       }