1 defmodule Pleroma.Search.Elasticsearch do
2 @behaviour Pleroma.Search
4 alias Pleroma.Web.MastodonAPI.StatusView
5 alias Pleroma.Web.MastodonAPI.AccountView
6 alias Pleroma.Web.ActivityPub.Visibility
7 alias Pleroma.Search.Elasticsearch.Parsers
8 alias Pleroma.Web.Endpoint
10 defp es_query(:activity, query) do
16 %{"_timestamp" => "desc"}
20 must: Parsers.Activity.parse(query)
26 defp es_query(:user, query) do
32 %{"_timestamp" => "desc"}
36 must: Parsers.User.parse(query)
42 defp es_query(:hashtag, query) do
49 must: Parsers.Hashtag.parse(query)
56 def search(%{assigns: %{user: user}} = _conn, %{q: query} = _params, _options) do
60 |> SearchParser.parse!()
64 q = es_query(:activity, parsed_query)
66 Pleroma.Elasticsearch.search(:activities, q)
67 |> Enum.filter(fn x -> Visibility.visible_for_user?(x, user) end)
72 q = es_query(:user, parsed_query)
74 Pleroma.Elasticsearch.search(:users, q)
75 |> Enum.filter(fn x -> Pleroma.User.visible_for(x, user) == :visible end)
80 q = es_query(:hashtag, parsed_query)
82 Pleroma.Elasticsearch.search(:hashtags, q)
85 activity_results = Task.await(activity_task)
86 user_results = Task.await(user_task)
87 hashtag_results = Task.await(hashtag_task)
91 AccountView.render("index.json",
96 Enum.map(hashtag_results, fn x ->
98 url: Endpoint.url() <> "/tag/" <> x,
103 StatusView.render("index.json",
104 activities: activity_results,