Search: Use RUM index.
This commit is contained in:
parent
17d01869ea
commit
01c45ddc9e
|
@ -1019,12 +1019,12 @@ def status_search(user, query) do
|
||||||
where: "https://www.w3.org/ns/activitystreams#Public" in a.recipients,
|
where: "https://www.w3.org/ns/activitystreams#Public" in a.recipients,
|
||||||
where:
|
where:
|
||||||
fragment(
|
fragment(
|
||||||
"to_tsvector('english', ?->>'content') @@ plainto_tsquery('english', ?)",
|
"? @@ plainto_tsquery('english', ?)",
|
||||||
o.data,
|
o.fts_content,
|
||||||
^query
|
^query
|
||||||
),
|
),
|
||||||
limit: 20,
|
limit: 20,
|
||||||
order_by: [desc: :id]
|
order_by: [fragment("? <=> now()::date", o.inserted_at)]
|
||||||
)
|
)
|
||||||
|
|
||||||
Repo.all(q) ++ fetched
|
Repo.all(q) ++ fetched
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
defmodule Pleroma.Repo.Migrations.AddFtsIndexToObjectsTwo do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def up do
|
||||||
|
drop_if_exists index(:objects, ["(to_tsvector('english', data->>'content'))"], using: :gin, name: :objects_fts)
|
||||||
|
alter table(:objects) do
|
||||||
|
add(:fts_content, :tsvector)
|
||||||
|
end
|
||||||
|
|
||||||
|
execute("CREATE FUNCTION objects_fts_update() RETURNS trigger AS $$
|
||||||
|
begin
|
||||||
|
new.fts_content := to_tsvector('english', new.data->>'content');
|
||||||
|
return new;
|
||||||
|
end
|
||||||
|
$$ LANGUAGE plpgsql")
|
||||||
|
execute("create index objects_fts on objects using RUM (fts_content rum_tsvector_addon_ops, inserted_at) with (attach = 'inserted_at', to = 'fts_content');")
|
||||||
|
|
||||||
|
execute("CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE ON objects
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE objects_fts_update()")
|
||||||
|
|
||||||
|
execute("UPDATE objects SET updated_at = NOW()")
|
||||||
|
end
|
||||||
|
|
||||||
|
def down do
|
||||||
|
execute "drop index objects_fts"
|
||||||
|
execute "drop trigger tsvectorupdate on objects"
|
||||||
|
execute "drop function objects_fts_update()"
|
||||||
|
alter table(:objects) do
|
||||||
|
remove(:fts_content, :tsvector)
|
||||||
|
end
|
||||||
|
create index(:objects, ["(to_tsvector('english', data->>'content'))"], using: :gin, name: :objects_fts)
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue