1 defmodule Pleroma.Elasticsearch do
5 alias Pleroma.Elasticsearch.DocumentMappings
10 Config.get([:elasticsearch, :url])
14 Config.get([:search, :provider]) == Pleroma.Search.Elasticsearch
17 def delete_by_id(:activity, id) do
19 Elastix.Document.delete(url(), "activities", "activity", id)
23 def put_by_id(:activity, id) do
25 |> Activity.get_by_id_with_object()
26 |> maybe_put_into_elasticsearch()
29 def maybe_put_into_elasticsearch({:ok, item}) do
30 maybe_put_into_elasticsearch(item)
33 def maybe_put_into_elasticsearch(
34 %{data: %{"type" => "Create"}, object: %{data: %{"type" => "Note"}}} = activity
37 actor = Pleroma.Activity.user_actor(activity)
40 |> Map.put(:user_actor, actor)
45 def maybe_put_into_elasticsearch(%User{actor_type: "Person"} = user) do
51 def maybe_put_into_elasticsearch(_) do
55 def maybe_bulk_post(data, type) do
61 def put(%Activity{} = activity) do
63 Elastix.Document.index(
67 DocumentMappings.Activity.id(activity),
68 DocumentMappings.Activity.encode(activity)
74 %{id: x, name: x, timestamp: DateTime.to_iso8601(DateTime.utc_now())}
76 |> bulk_post(:hashtags)
78 {:error, %{reason: err}} ->
79 Logger.error("Could not put activity: #{err}")
84 def put(%User{} = user) do
86 Elastix.Document.index(
90 DocumentMappings.User.id(user),
91 DocumentMappings.User.encode(user)
95 {:error, %{reason: err}} ->
96 Logger.error("Could not put user: #{err}")
101 def bulk_post(data, :activities) do
104 |> Enum.filter(fn x ->
107 |> Map.get(:data, %{})
108 |> Map.get("type", "")
114 %{index: %{_id: DocumentMappings.Activity.id(d)}},
115 DocumentMappings.Activity.encode(d)
120 with {:ok, %{body: %{"errors" => false}}} <-
129 {:error, %{reason: err}} ->
130 Logger.error("Could not bulk put activity: #{err}")
132 {:ok, %{body: body}} ->
138 def bulk_post(data, :users) do
141 |> Enum.filter(fn x -> x.actor_type == "Person" end)
144 %{index: %{_id: DocumentMappings.User.id(d)}},
145 DocumentMappings.User.encode(d)
150 with {:ok, %{body: %{"errors" => false}}} <-
159 {:error, %{reason: err}} ->
160 Logger.error("Could not bulk put users: #{err}")
162 {:ok, %{body: body}} ->
168 def bulk_post(data, :hashtags) when is_list(data) do
173 %{index: %{_id: DocumentMappings.Hashtag.id(d)}},
174 DocumentMappings.Hashtag.encode(d)
179 with {:ok, %{body: %{"errors" => false}}} <-
188 {:error, %{reason: err}} ->
189 Logger.error("Could not bulk put hashtags: #{err}")
191 {:ok, %{body: body}} ->
197 def bulk_post(_, :hashtags), do: {:ok, nil}
199 def search(_, _, _, :skip), do: []
201 def search(:raw, index, type, q) do
202 with {:ok, raw_results} <- Elastix.Search.search(url(), index, [type], q) do
205 |> Map.get(:body, %{})
206 |> Map.get("hits", %{})
207 |> Map.get("hits", [])
217 def search(:activities, q) do
218 with {:ok, results} <- search(:raw, "activities", "activity", q) do
220 |> Enum.map(fn result -> result["_id"] end)
221 |> Pleroma.Activity.all_by_ids_with_object()
222 |> Enum.sort(&(&1.inserted_at >= &2.inserted_at))
230 def search(:users, q) do
231 with {:ok, results} <- search(:raw, "users", "user", q) do
233 |> Enum.map(fn result -> result["_id"] end)
234 |> Pleroma.User.get_all_by_ids()
242 def search(:hashtags, q) do
243 with {:ok, results} <- search(:raw, "hashtags", "hashtag", q) do
245 |> Enum.map(fn result -> result["_source"]["hashtag"] end)