Uni Ecto Plugin _best_ Access
def autocomplete(conn, %"term" => term) do suggestions = Blog.search_posts(term, []) |> Enum.take(5) |> Enum.map(&%title: &1.title, id: &1.id)
def mount(_params, _session, socket) do :ok, assign(socket, search_term: "", results: [], searching: false) 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
:ok end
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: % relevance: fragment( "ts_rank(to_tsvector('english', ?), plainto_tsquery('english', ?))", fragment("coalesce(?, '') , 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 def autocomplete(conn, %"term" => term) do suggestions =
render(conn, "index.html", query: query, results: results, total_count: length(results) ) end
base_query |> apply_filters(params) |> apply_full_text_search(params) |> rank_by_relevance(params[:search_term]) end term) do suggestions = Blog.search_posts(term
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