1 defmodule Pleroma.Elasticsearch do
4 alias Pleroma.Elasticsearch.DocumentMappings
9 Config.get([:elasticsearch, :url])
13 Config.get([:search, :provider]) == Pleroma.Search.Elasticsearch
16 def put_by_id(:activity, id) do
18 |> Activity.get_by_id_with_object()
19 |> maybe_put_into_elasticsearch()
22 def maybe_put_into_elasticsearch({:ok, item}) do
23 maybe_put_into_elasticsearch(item)
26 def maybe_put_into_elasticsearch(
27 %{data: %{"type" => "Create"}, object: %{data: %{"type" => "Note"}}} = activity
30 actor = Pleroma.Activity.user_actor(activity)
33 |> Map.put(:user_actor, actor)
38 def maybe_put_into_elasticsearch(%User{actor_type: "Person"} = user) do
44 def maybe_put_into_elasticsearch(_) do
48 def put(%Activity{} = activity) do
50 Elastix.Document.index(
54 DocumentMappings.Activity.id(activity),
55 DocumentMappings.Activity.encode(activity)
59 def put(%User{} = user) do
61 Elastix.Document.index(
65 DocumentMappings.User.id(user),
66 DocumentMappings.User.encode(user)
70 def bulk_post(data, :activities) do
73 |> Enum.filter(fn x ->
76 |> Map.get(:data, %{})
77 |> Map.get("type", "")
83 %{index: %{_id: DocumentMappings.Activity.id(d)}},
84 DocumentMappings.Activity.encode(d)
89 {:ok, %{body: %{"errors" => false}}} =
98 def maybe_bulk_post(data, type) do
100 bulk_post(data, type)
104 def bulk_post(data, :users) do
107 |> Enum.filter(fn x -> x.actor_type == "Person" end)
110 %{index: %{_id: DocumentMappings.User.id(d)}},
111 DocumentMappings.User.encode(d)
124 def bulk_post([] = data, :hashtags) do
129 %{index: %{_id: DocumentMappings.Hashtag.id(d)}},
130 DocumentMappings.Hashtag.encode(d)
143 def bulk_post(_, :hashtags), do: {:ok, nil}
145 def search(_, _, _, :skip), do: []
147 def search(:raw, index, type, q) do
148 with {:ok, raw_results} <- Elastix.Search.search(url(), index, [type], q) do
151 |> Map.get(:body, %{})
152 |> Map.get("hits", %{})
153 |> Map.get("hits", [])
163 def search(:activities, q) do
164 with {:ok, results} <- search(:raw, "activities", "activity", q) do
166 |> Enum.map(fn result -> result["_id"] end)
167 |> Pleroma.Activity.all_by_ids_with_object()
168 |> Enum.sort(&(&1.inserted_at >= &2.inserted_at))
176 def search(:users, q) do
177 with {:ok, results} <- search(:raw, "users", "user", q) do
179 |> Enum.map(fn result -> result["_id"] end)
180 |> Pleroma.User.get_all_by_ids()
188 def search(:hashtags, q) do
189 with {:ok, results} <- search(:raw, "hashtags", "hashtag", q) do
191 |> Enum.map(fn result -> result["_source"]["hashtag"] end)