diff --git a/CHANGELOG.md b/CHANGELOG.md index 8649d65c8..bc69dddeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## Unreleased +## Fixed +- Search results for the default built-in GIN search are now actually ranked by relevancy + ## 2024.04 ## Added diff --git a/lib/pleroma/search/database_search.ex b/lib/pleroma/search/database_search.ex index bf566c3cb..010e3ccbb 100644 --- a/lib/pleroma/search/database_search.ex +++ b/lib/pleroma/search/database_search.ex @@ -15,6 +15,9 @@ defmodule Pleroma.Search.DatabaseSearch do @behaviour Pleroma.Search.SearchBackend + # See: https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-RANKING + @rank_normalisation 16 + def search(user, search_query, options \\ []) do index_type = if Pleroma.Config.get([:database, :rum_enabled]), do: :rum, else: :gin limit = Enum.min([Keyword.get(options, :limit), 40]) @@ -31,7 +34,7 @@ def search(user, search_query, options \\ []) do |> maybe_restrict_author(author) |> maybe_restrict_blocked(user) |> Pagination.fetch_paginated( - %{"offset" => offset, "limit" => limit, "skip_order" => index_type == :rum}, + %{"offset" => offset, "limit" => limit, "skip_order" => true}, :offset ) |> maybe_fetch(user, search_query) @@ -86,7 +89,18 @@ defp query_with(q, :gin, search_query) do o.data, ^tsc, ^search_query - ) + ), + order_by: [ + desc: + fragment( + "ts_rank_cd(to_tsvector(?::oid::regconfig, ?->>'content'), websearch_to_tsquery(?::oid::regconfig, ?), ?)", + ^tsc, + o.data, + ^tsc, + ^search_query, + @rank_normalisation + ) + ] ) end