Make use of the indices.
authorlain <lain@soykaf.club>
Sat, 19 Jan 2019 23:31:17 +0000 (00:31 +0100)
committerlain <lain@soykaf.club>
Sat, 19 Jan 2019 23:31:17 +0000 (00:31 +0100)
Indices in postgresql rely on operators, so they won't be used if you use only functions.

lib/pleroma/user.ex
priv/repo/migrations/20190118074940_fix_user_trigram_index.exs

index eb4218ebee8d5d0f4900182d10fafb895829eeba..87815e11c9dd0f26598a0f7466661c18352b8b1c 100644 (file)
@@ -734,7 +734,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
 
@@ -750,7 +759,7 @@ defmodule Pleroma.User do
             u.name
           )
       },
-      where: not is_nil(u.nickname)
+      where: fragment("trim(? || ' ' || coalesce(?, '')) % ?", u.nickname, u.name, ^query)
     )
   end
 
index 4f7712eb02269387e8465a3c1ca6cec6e7772de9..b4e8c984ce80a8e3a2da2ca30b90717f1f716bc6 100644 (file)
@@ -2,12 +2,21 @@ defmodule Pleroma.Repo.Migrations.FixUserTrigramIndex do
   use Ecto.Migration
 
   def up do
-    drop_if_exists index(:users, [], name: :users_trigram_index)
-    create index(:users, ["(trim(nickname || ' ' || name)) gist_trgm_ops"], name: :users_trigram_index, using: :gist)
+    drop_if_exists(index(:users, [], name: :users_trigram_index))
+
+    create(
+      index(:users, ["(trim(nickname || ' ' || coalesce(name, ''))) gist_trgm_ops"],
+        name: :users_trigram_index,
+        using: :gist
+      )
+    )
   end
 
   def down do
-    drop_if_exists index(:users, [], name: :users_trigram_index)
-    create index(:users, ["(nickname || name) gist_trgm_ops"], name: :users_trigram_index, using: :gist)
+    drop_if_exists(index(:users, [], name: :users_trigram_index))
+
+    create(
+      index(:users, ["(nickname || name) gist_trgm_ops"], name: :users_trigram_index, using: :gist)
+    )
   end
 end