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 put_by_id(:activity, id) do
19 |> Activity.get_by_id_with_object()
20 |> maybe_put_into_elasticsearch()
23 def maybe_put_into_elasticsearch({:ok, item}) do
24 maybe_put_into_elasticsearch(item)
27 def maybe_put_into_elasticsearch(
28 %{data: %{"type" => "Create"}, object: %{data: %{"type" => "Note"}}} = activity
31 actor = Pleroma.Activity.user_actor(activity)
34 |> Map.put(:user_actor, actor)
39 def maybe_put_into_elasticsearch(%User{actor_type: "Person"} = user) do
45 def maybe_put_into_elasticsearch(_) do
49 def maybe_bulk_post(data, type) do
55 def put(%Activity{} = activity) do
57 Elastix.Document.index(
61 DocumentMappings.Activity.id(activity),
62 DocumentMappings.Activity.encode(activity)
68 |> Enum.map(fn x -> %{id: x, name: x, timestamp: DateTime.to_iso8601(DateTime.utc_now())} end)
69 |> bulk_post(:hashtags)
72 def put(%User{} = user) do
74 Elastix.Document.index(
78 DocumentMappings.User.id(user),
79 DocumentMappings.User.encode(user)
83 def bulk_post(data, :activities) do
86 |> Enum.filter(fn x ->
89 |> Map.get(:data, %{})
90 |> Map.get("type", "")
96 %{index: %{_id: DocumentMappings.Activity.id(d)}},
97 DocumentMappings.Activity.encode(d)
102 {:ok, %{body: %{"errors" => false}}} =
111 def bulk_post(data, :users) do
116 %{index: %{_id: DocumentMappings.User.id(d)}},
117 DocumentMappings.User.encode(d)
130 def bulk_post(data, :hashtags) when is_list(data) do
135 %{index: %{_id: DocumentMappings.Hashtag.id(d)}},
136 DocumentMappings.Hashtag.encode(d)
149 def bulk_post(_, :hashtags), do: {:ok, nil}
151 def search(_, _, _, :skip), do: []
153 def search(:raw, index, type, q) do
154 with {:ok, raw_results} <- Elastix.Search.search(url(), index, [type], q) do
157 |> Map.get(:body, %{})
158 |> Map.get("hits", %{})
159 |> Map.get("hits", [])
169 def search(:activities, q) do
170 with {:ok, results} <- search(:raw, "activities", "activity", q) do
172 |> Enum.map(fn result -> result["_id"] end)
173 |> Pleroma.Activity.all_by_ids_with_object()
174 |> Enum.sort(&(&1.inserted_at >= &2.inserted_at))
182 def search(:users, q) do
183 with {:ok, results} <- search(:raw, "users", "user", q) do
185 |> Enum.map(fn result -> result["_id"] end)
186 |> Pleroma.User.get_all_by_ids()
194 def search(:hashtags, q) do
195 with {:ok, results} <- search(:raw, "hashtags", "hashtag", q) do
197 |> Enum.map(fn result -> result["_source"]["hashtag"] end)