Removed unused trigram index on `users`. Fixed `users_fts_index` usage.
This commit is contained in:
parent
704a383055
commit
123352ffa1
|
@ -69,11 +69,15 @@ defp fts_search(query, query_string) do
|
||||||
u in query,
|
u in query,
|
||||||
where:
|
where:
|
||||||
fragment(
|
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.nickname,
|
||||||
|
u.name,
|
||||||
^query_string
|
^query_string
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -95,9 +99,11 @@ defp trigram_rank(query, query_string) do
|
||||||
select_merge: %{
|
select_merge: %{
|
||||||
search_rank:
|
search_rank:
|
||||||
fragment(
|
fragment(
|
||||||
"similarity(?, ?) + \
|
"""
|
||||||
similarity(?, regexp_replace(?, '@.+', '')) + \
|
similarity(?, ?) +
|
||||||
similarity(?, trim(coalesce(?, '')))",
|
similarity(?, regexp_replace(?, '@.+', '')) +
|
||||||
|
similarity(?, trim(coalesce(?, '')))
|
||||||
|
""",
|
||||||
^query_string,
|
^query_string,
|
||||||
u.nickname,
|
u.nickname,
|
||||||
^query_string,
|
^query_string,
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
defmodule Pleroma.Repo.Migrations.DropUserTrigramIndex do
|
||||||
|
@moduledoc "Drops unused trigram index on `users` (FTS index is being used instead)"
|
||||||
|
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def up do
|
||||||
|
drop_if_exists(index(:users, [], name: :users_trigram_index))
|
||||||
|
end
|
||||||
|
|
||||||
|
def down do
|
||||||
|
create_if_not_exists(
|
||||||
|
index(:users, ["(trim(nickname || ' ' || coalesce(name, ''))) gist_trgm_ops"],
|
||||||
|
name: :users_trigram_index,
|
||||||
|
using: :gist
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
|
@ -72,15 +72,11 @@ test "finds a user by full name or leading fragment(s) of its words" do
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
test "is not [yet] capable of matching by non-leading fragments (e.g. by domain)" do
|
test "matches by leading fragment of user domain" do
|
||||||
user1 = insert(:user, %{nickname: "iamthedude"})
|
user = insert(:user, %{nickname: "arandom@dude.com"})
|
||||||
insert(:user, %{nickname: "arandom@dude.com"})
|
insert(:user, %{nickname: "iamthedude"})
|
||||||
|
|
||||||
assert [] == User.search("dude")
|
assert [user.id] == User.search("dud") |> Enum.map(& &1.id)
|
||||||
|
|
||||||
# Matching by leading fragment works, though
|
|
||||||
user1_id = user1.id
|
|
||||||
assert ^user1_id = User.search("iam") |> List.first() |> Map.get(:id)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
test "ranks full nickname match higher than full name match" do
|
test "ranks full nickname match higher than full name match" do
|
||||||
|
|
Loading…
Reference in New Issue