Uni Ecto Plugin __top__ May 2026

Uni Ecto Plugin __top__ May 2026

defp rank_by_relevance(query, nil), do: query defp rank_by_relevance(query, term) when term == "", do: query defp rank_by_relevance(query, term) do from q in query, select_merge: %, order_by: [desc: fragment("relevance")] end end # lib/my_app/blog/blog.ex defmodule MyApp.Blog do import Ecto.Query alias MyApp.Repo alias MyApp.Blog.Post def search_posts(search_term, filters \ []) do Post |> search(search_term) # From plugin |> apply_filters(filters) |> order_by_relevance(search_term) |> Repo.all() end

json(conn, %suggestions: suggestions) end end # lib/my_app_web/live/search_live.ex defmodule MyAppWeb.SearchLive do use MyAppWeb, :live_view alias MyApp.Blog uni ecto plugin

defp update_search_vector(changeset) do case changeset do %Ecto.Changesetvalid?: true -> Ecto.Changeset.put_change(changeset, :search_vector, fragment( "to_tsvector('english', coalesce(?, '') || ' ' || coalesce(?, ''))", changeset.data.title, changeset.data.content )) _ -> changeset end end end # priv/repo/migrations/20240101000000_add_full_text_search.exs defmodule MyApp.Repo.Migrations.AddFullTextSearch do use Ecto.Migration def change do # Add GIN index for full-text search execute(""" CREATE INDEX posts_search_idx ON posts USING GIN(to_tsvector('english', title || ' ' || content)) """) do: query defp rank_by_relevance(query

def mount(_params, _session, socket) do :ok, assign(socket, search_term: "", results: [], searching: false) end term) when term == ""

# Optional: Add precomputed tsvector column alter table(:posts) do add :search_vector, :tsvector end

:ok end