1 defmodule Pleroma.Search.Elasticsearch do
2 @behaviour Pleroma.Search
5 alias Pleroma.Object.Fetcher
6 alias Pleroma.Web.MastodonAPI.StatusView
7 alias Pleroma.Web.MastodonAPI.AccountView
8 alias Pleroma.Web.ActivityPub.Visibility
9 alias Pleroma.Search.Elasticsearch.Parsers
10 alias Pleroma.Web.Endpoint
12 def es_query(:activity, query) do
13 must = Parsers.Activity.parse(query)
24 %{_timestamp: %{order: "desc", format: "basic_date_time"}}
35 def es_query(:user, query) do
36 must = Parsers.User.parse(query)
57 def es_query(:hashtag, query) do
58 must = Parsers.Hashtag.parse(query)
72 must: Parsers.Hashtag.parse(query)
79 defp maybe_fetch(:activity, search_query) do
80 with true <- Regex.match?(~r/https?:/, search_query),
81 {:ok, object} <- Fetcher.fetch_object_from_id(search_query),
82 %Activity{} = activity <- Activity.get_create_by_object_ap_id(object.data["id"]) do
90 def search(%{assigns: %{user: user}} = _conn, %{q: query} = _params, _options) do
94 |> SearchParser.parse!()
98 maybe_fetch(:activity, String.trim(query))
103 q = es_query(:activity, parsed_query)
105 Pleroma.Elasticsearch.search(:activities, q)
106 |> Enum.filter(fn x -> Visibility.visible_for_user?(x, user) end)
111 q = es_query(:user, parsed_query)
113 Pleroma.Elasticsearch.search(:users, q)
114 |> Enum.filter(fn x -> Pleroma.User.visible_for(x, user) == :visible end)
119 q = es_query(:hashtag, parsed_query)
121 Pleroma.Elasticsearch.search(:hashtags, q)
124 activity_results = Task.await(activity_task)
125 user_results = Task.await(user_task)
126 hashtag_results = Task.await(hashtag_task)
127 direct_activity = Task.await(activity_fetch_task)
130 if direct_activity == nil do
133 [direct_activity | activity_results]
138 AccountView.render("index.json",
143 Enum.map(hashtag_results, fn x ->
145 url: Endpoint.url() <> "/tag/" <> x,
150 StatusView.render("index.json",
151 activities: activity_results,