Set custom similarity limit.
[akkoma] / lib / pleroma / user.ex
index 1d0bf1edfd0f7ebaeb3ce787c1c47d0f6f620e91..955808e285ebee00bd81d7e3afb2334a353587b3 100644 (file)
@@ -686,7 +686,11 @@ defmodule Pleroma.User do
 
     fts_results = do_search(fts_search_subquery(query), for_user)
 
-    trigram_results = do_search(trigram_search_subquery(query), for_user)
+    {:ok, trigram_results} =
+      Repo.transaction(fn ->
+        Ecto.Adapters.SQL.query(Repo, "select set_limit(0.25)", [])
+        do_search(trigram_search_subquery(query), for_user)
+      end)
 
     Enum.uniq_by(fts_results ++ trigram_results, & &1.id)
   end
@@ -734,7 +738,16 @@ defmodule Pleroma.User do
             ^processed_query
           )
       },
-      where: not is_nil(u.nickname)
+      where:
+        fragment(
+          """
+            (setweight(to_tsvector('simple', regexp_replace(?, '\\W', ' ', 'g')), 'A') ||
+            setweight(to_tsvector('simple', regexp_replace(coalesce(?, ''), '\\W', ' ', 'g')), 'B')) @@ to_tsquery('simple', ?)
+          """,
+          u.nickname,
+          u.name,
+          ^processed_query
+        )
     )
   end
 
@@ -744,13 +757,13 @@ defmodule Pleroma.User do
       select_merge: %{
         search_rank:
           fragment(
-            "similarity(?, ? || ' ' || coalesce(?, ''))",
+            "similarity(?, trim(? || ' ' || coalesce(?, '')))",
             ^query,
             u.nickname,
             u.name
           )
       },
-      where: not is_nil(u.nickname)
+      where: fragment("trim(? || ' ' || coalesce(?, '')) % ?", u.nickname, u.name, ^query)
     )
   end