add hashtag indexing
[akkoma] / lib / pleroma / elasticsearch / store.ex
1 defmodule Pleroma.Elasticsearch do
2 alias Pleroma.Activity
3 alias Pleroma.Elasticsearch.DocumentMappings
4 alias Pleroma.Config
5
6 defp url do
7 Config.get([:elasticsearch, :url])
8 end
9
10 def put_by_id(id) do
11 id
12 |> Activity.get_by_id_with_object()
13 |> maybe_put_into_elasticsearch()
14 end
15
16 def maybe_put_into_elasticsearch({:ok, activity}) do
17 maybe_put_into_elasticsearch(activity)
18 end
19
20 def maybe_put_into_elasticsearch(%{data: %{"type" => "Create"}, object: %{data: %{"type" => "Note"}}} = activity) do
21 if Config.get([:search, :provider]) == Pleroma.Search.Elasticsearch do
22 actor = Pleroma.Activity.user_actor(activity)
23
24 activity
25 |> Map.put(:user_actor, actor)
26 |> put()
27 end
28 end
29
30 def maybe_put_into_elasticsearch(_) do
31 {:ok, :skipped}
32 end
33
34 def put(%Activity{} = activity) do
35 Elastix.Document.index(
36 url(),
37 "activities",
38 "activity",
39 DocumentMappings.Activity.id(activity),
40 DocumentMappings.Activity.encode(activity)
41 )
42 end
43
44 def bulk_post(data, :activities) do
45 d =
46 data
47 |> Enum.filter(fn x ->
48 t = x.object
49 |> Map.get(:data, %{})
50 |> Map.get("type", "")
51 t == "Note"
52 end)
53 |> Enum.map(fn d ->
54 [
55 %{index: %{_id: DocumentMappings.Activity.id(d)}},
56 DocumentMappings.Activity.encode(d)
57 ]
58 end)
59 |> List.flatten()
60
61 Elastix.Bulk.post(
62 url(),
63 d,
64 index: "activities",
65 type: "activity"
66 )
67 end
68
69 def bulk_post(data, :users) do
70 d =
71 data
72 |> Enum.map(fn d ->
73 [
74 %{index: %{_id: DocumentMappings.User.id(d)}},
75 DocumentMappings.User.encode(d)
76 ]
77 end)
78 |> List.flatten()
79
80 Elastix.Bulk.post(
81 url(),
82 d,
83 index: "users",
84 type: "user"
85 )
86 end
87
88 def bulk_post(data, :hashtags) do
89 d =
90 data
91 |> Enum.map(fn d ->
92 [
93 %{index: %{_id: DocumentMappings.Hashtag.id(d)}},
94 DocumentMappings.Hashtag.encode(d)
95 ]
96 end)
97 |> List.flatten()
98
99 Elastix.Bulk.post(
100 url(),
101 d,
102 index: "hashtags",
103 type: "hashtag"
104 )
105 end
106
107 def search_activities(q) do
108 Elastix.Search.search(
109 url(),
110 "activities",
111 ["activity"],
112 q
113 )
114 end
115 end