+ options = search_options(params, user)
+ if Pleroma.Config.get([:search, :provider]) == :elasticsearch do
+ elasticsearch_search(conn, query, options)
+ else
+ builtin_search(version, conn, params)
+ end
+ end
+
+ defp elasticsearch_search(%{assigns: %{user: user}} = conn, query, options) do
+ with {:ok, raw_results} <- Pleroma.Elasticsearch.search(query) do
+ results = raw_results
+ |> Map.get(:body, %{})
+ |> Map.get("hits", %{})
+ |> Map.get("hits", [])
+ |> Enum.map(fn result -> result["_id"] end)
+ |> Pleroma.Activity.all_by_ids_with_object()
+
+ json(
+ conn,
+ %{
+ accounts: [],
+ hashtags: [],
+ statuses: StatusView.render("index.json",
+ activities: results,
+ for: user,
+ as: :activity
+ )}
+ )
+ else
+ {:error, _} ->
+ conn
+ |> put_status(:internal_server_error)
+ |> json(%{error: "Search failed"})
+ end
+ end
+
+ defp builtin_search(version, %{assigns: %{user: user}} = conn, %{q: query} = params) do