1 # Akkoma: A lightweight social networking server
2 # Copyright © 2022-2022 Akkoma Authors <https://git.ihatebeinga.live/IHBAGang/akkoma/>
3 # SPDX-License-Identifier: AGPL-3.0-only
5 defmodule Pleroma.Elasticsearch do
9 alias Pleroma.Elasticsearch.DocumentMappings
14 Config.get([:elasticsearch, :url])
18 Config.get([:search, :provider]) == Pleroma.Search.Elasticsearch
21 def delete_by_id(:activity, id) do
23 Elastix.Document.delete(url(), "activities", "activity", id)
27 def put_by_id(:activity, id) do
29 |> Activity.get_by_id_with_object()
30 |> maybe_put_into_elasticsearch()
33 def maybe_put_into_elasticsearch({:ok, item}) do
34 maybe_put_into_elasticsearch(item)
37 def maybe_put_into_elasticsearch(
38 %{data: %{"type" => "Create"}, object: %{data: %{"type" => "Note"}}} = activity
41 actor = Pleroma.Activity.user_actor(activity)
44 |> Map.put(:user_actor, actor)
49 def maybe_put_into_elasticsearch(%User{actor_type: "Person"} = user) do
55 def maybe_put_into_elasticsearch(_) do
59 def maybe_bulk_post(data, type) do
65 def put(%Activity{} = activity) do
67 Elastix.Document.index(
71 DocumentMappings.Activity.id(activity),
72 DocumentMappings.Activity.encode(activity)
78 %{id: x, name: x, timestamp: DateTime.to_iso8601(DateTime.utc_now())}
80 |> bulk_post(:hashtags)
82 {:error, %{reason: err}} ->
83 Logger.error("Could not put activity: #{err}")
88 def put(%User{} = user) do
90 Elastix.Document.index(
94 DocumentMappings.User.id(user),
95 DocumentMappings.User.encode(user)
99 {:error, %{reason: err}} ->
100 Logger.error("Could not put user: #{err}")
105 def bulk_post(data, :activities) do
108 |> Enum.filter(fn x ->
111 |> Map.get(:data, %{})
112 |> Map.get("type", "")
118 %{index: %{_id: DocumentMappings.Activity.id(d)}},
119 DocumentMappings.Activity.encode(d)
124 with {:ok, %{body: %{"errors" => false}}} <-
133 {:error, %{reason: err}} ->
134 Logger.error("Could not bulk put activity: #{err}")
137 {:ok, %{body: body}} ->
143 def bulk_post(data, :users) do
146 |> Enum.filter(fn x -> x.actor_type == "Person" end)
149 %{index: %{_id: DocumentMappings.User.id(d)}},
150 DocumentMappings.User.encode(d)
155 with {:ok, %{body: %{"errors" => false}}} <-
164 {:error, %{reason: err}} ->
165 Logger.error("Could not bulk put users: #{err}")
168 {:ok, %{body: body}} ->
174 def bulk_post(data, :hashtags) when is_list(data) do
179 %{index: %{_id: DocumentMappings.Hashtag.id(d)}},
180 DocumentMappings.Hashtag.encode(d)
185 with {:ok, %{body: %{"errors" => false}}} <-
194 {:error, %{reason: err}} ->
195 Logger.error("Could not bulk put hashtags: #{err}")
198 {:ok, %{body: body}} ->
204 def bulk_post(_, :hashtags), do: {:ok, nil}
206 def search(_, _, _, :skip), do: []
208 def search(:raw, index, type, q) do
209 with {:ok, raw_results} <- Elastix.Search.search(url(), index, [type], q) do
212 |> Map.get(:body, %{})
213 |> Map.get("hits", %{})
214 |> Map.get("hits", [])
224 def search(:activities, q) do
225 with {:ok, results} <- search(:raw, "activities", "activity", q) do
227 |> Enum.map(fn result -> result["_id"] end)
228 |> Pleroma.Activity.all_by_ids_with_object()
229 |> Enum.sort(&(&1.inserted_at >= &2.inserted_at))
237 def search(:users, q) do
238 with {:ok, results} <- search(:raw, "users", "user", q) do
240 |> Enum.map(fn result -> result["_id"] end)
241 |> Pleroma.User.get_all_by_ids()
249 def search(:hashtags, q) do
250 with {:ok, results} <- search(:raw, "hashtags", "hashtag", q) do
252 |> Enum.map(fn result -> result["_source"]["hashtag"] end)