defmodule Pleroma.Elasticsearch do
alias Pleroma.Activity
alias Pleroma.Elasticsearch.DocumentMappings
-
- @searchable [
- "hashtag", "instance", "user"
- ]
+ alias Pleroma.Config
defp url do
- Pleroma.Config.get([:elasticsearch, :url])
+ Config.get([:elasticsearch, :url])
end
- def put(%Activity{} = activity) do
- Elastix.Document.index(
- url(),
- "activities",
- "activity",
- DocumentMappings.Activity.id(activity),
- DocumentMappings.Activity.encode(activity)
- )
+ def put_by_id(id) do
+ id
+ |> Activity.get_by_id_with_object()
+ |> maybe_put_into_elasticsearch()
end
- def bulk_post(data, :activities) do
- d = data
- |> Enum.map(fn d ->
- [
- %{index: %{_id: DocumentMappings.Activity.id(d)}},
- DocumentMappings.Activity.encode(d)
- ]
- end)
- |> List.flatten()
-
- Elastix.Bulk.post(
- url(),
- d,
- index: "activities",
- type: "activity"
- )
+ def maybe_put_into_elasticsearch({:ok, activity}) do
+ maybe_put_into_elasticsearch(activity)
end
- defp parse_term(t) do
- if String.contains?(t, ":") and !String.starts_with?(t, "\"") do
- [field, query] = String.split(t, ":")
- if Enum.member?(@searchable, field) do
- {field, query}
- else
- {"content", query}
- end
- else
- {"content", t}
- end
- end
+ def maybe_put_into_elasticsearch(%{data: %{"type" => "Create"}, object: %{data: %{"type" => "Note"}}} = activity) do
+ if Config.get([:search, :provider]) == Pleroma.Search.Elasticsearch do
+ actor = Pleroma.Activity.user_actor(activity)
- defp search_user(params, q) do
- if q["user"] != nil do
- params ++ [%{match: %{user: %{
- query: Enum.join(q["user"], " "),
- operator: "OR"
- }}}]
- else
- params
+ activity
+ |> Map.put(:user_actor, actor)
+ |> put()
end
end
- defp search_instance(params, q) do
- if q["instance"] != nil do
- params ++ [%{match: %{instance: %{
- query: Enum.join(q["instance"], " "),
- operator: "OR"
- }}}]
- else
- params
- end
+ def maybe_put_into_elasticsearch(_) do
+ {:ok, :skipped}
end
- defp search_content(params, q) do
- if q["content"] != nil do
- params ++ [%{match: %{content: %{
- query: Enum.join(q["content"], " "),
- operator: "AND"
- }}}]
- else
- params
- end
- end
-
- defp to_es(q) do
- []
- |> search_content(q)
- |> search_instance(q)
- |> search_user(q)
+ def put(%Activity{} = activity) do
+ Elastix.Document.index(
+ url(),
+ "activities",
+ "activity",
+ DocumentMappings.Activity.id(activity),
+ DocumentMappings.Activity.encode(activity)
+ )
end
- defp parse(query) do
- String.split(query, " ")
- |> Enum.map(&parse_term/1)
- |> Enum.reduce(%{}, fn {field, query}, acc ->
- Map.put(acc, field,
- Map.get(acc, field, []) ++ [query]
- )
- end)
- |> to_es()
+ def bulk_post(data, :activities) do
+ d =
+ data
+ |> Enum.map(fn d ->
+ [
+ %{index: %{_id: DocumentMappings.Activity.id(d)}},
+ DocumentMappings.Activity.encode(d)
+ ]
+ end)
+ |> List.flatten()
+
+ Elastix.Bulk.post(
+ url(),
+ d,
+ index: "activities",
+ type: "activity"
+ )
end
-
- def search(query) do
- q = %{query: %{
- bool: %{
- must: parse(query)
- }
- }}
- IO.inspect(q)
+
+ def search_activities(q) do
Elastix.Search.search(
- url(),
- "activities",
- ["activity"],
- q
+ url(),
+ "activities",
+ ["activity"],
+ q
)
end
end