Uni Ecto Plugin < POPULAR ★ >
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: % coalesce(?, '')", q.title, q.content), ^term ) , 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
:ok end
setup do %Post{} |> Post.changeset(% title: "Elixir Full-Text Search", content: "This article explains how to implement full-text search" ) |> Repo.insert!() uni ecto plugin
# Optional: Add precomputed tsvector column alter table(:posts) do add :search_vector, :tsvector end do: query defp rank_by_relevance(query
def index(conn, %"q" => query) do results = Blog.search_posts(query, category: conn.params["category"]) term) when term == ""