re-add fetching by url
authorFloatingGhost <hannah@coffee-and-dreams.uk>
Wed, 15 Dec 2021 10:57:47 +0000 (10:57 +0000)
committerFloatingGhost <hannah@coffee-and-dreams.uk>
Wed, 15 Dec 2021 10:58:09 +0000 (10:58 +0000)
lib/pleroma/elasticsearch/store.ex
lib/pleroma/search/elasticsearch.ex

index 5f2acd420d326fae04412bc94de847b6f0dab283..ffa6d47691ca504d8bb25c9a2a1d9c0bd21297d8 100644 (file)
@@ -165,6 +165,7 @@ defmodule Pleroma.Elasticsearch do
       results
       |> Enum.map(fn result -> result["_id"] end)
       |> Pleroma.Activity.all_by_ids_with_object()
+      |> Enum.sort(&(&1.inserted_at >= &2.inserted_at))
     else
       e ->
         Logger.error(e)
index eabd2a8521a3fd56c27858c0be438c93f2bf33d4..614a48bb9605fd51fedf8e54fc6a5c7fd1dd2a1c 100644 (file)
@@ -1,6 +1,8 @@
 defmodule Pleroma.Search.Elasticsearch do
   @behaviour Pleroma.Search
 
+  alias Pleroma.Activity
+  alias Pleroma.Object.Fetcher
   alias Pleroma.Web.MastodonAPI.StatusView
   alias Pleroma.Web.MastodonAPI.AccountView
   alias Pleroma.Web.ActivityPub.Visibility
@@ -18,7 +20,8 @@ defmodule Pleroma.Search.Elasticsearch do
         terminate_after: 50,
         timeout: "5s",
         sort: [
-          %{"_timestamp" => "desc"}
+          "_score",
+          %{_timestamp: %{order: "desc", format: "basic_date_time"}}
         ],
         query: %{
           bool: %{
@@ -39,6 +42,9 @@ defmodule Pleroma.Search.Elasticsearch do
         size: 50,
         terminate_after: 50,
         timeout: "5s",
+        sort: [
+          "_score"
+        ],
         query: %{
           bool: %{
             must: must
@@ -58,6 +64,9 @@ defmodule Pleroma.Search.Elasticsearch do
         size: 50,
         terminate_after: 50,
         timeout: "5s",
+        sort: [
+          "_score"
+        ],
         query: %{
           bool: %{
             must: Parsers.Hashtag.parse(query)
@@ -67,6 +76,16 @@ defmodule Pleroma.Search.Elasticsearch do
     end
   end
 
+  defp maybe_fetch(:activity, search_query) do
+    with true <- Regex.match?(~r/https?:/, search_query),
+         {:ok, object} <- Fetcher.fetch_object_from_id(search_query),
+         %Activity{} = activity <- Activity.get_create_by_object_ap_id(object.data["id"]) do
+      activity
+    else
+      _ -> nil
+    end
+  end
+
   @impl Pleroma.Search
   def search(%{assigns: %{user: user}} = _conn, %{q: query} = _params, _options) do
     parsed_query =
@@ -74,6 +93,11 @@ defmodule Pleroma.Search.Elasticsearch do
       |> String.trim()
       |> SearchParser.parse!()
 
+    activity_fetch_task =
+      Task.async(fn ->
+        maybe_fetch(:activity, String.trim(query))
+      end)
+
     activity_task =
       Task.async(fn ->
         q = es_query(:activity, parsed_query)
@@ -100,6 +124,14 @@ defmodule Pleroma.Search.Elasticsearch do
     activity_results = Task.await(activity_task)
     user_results = Task.await(user_task)
     hashtag_results = Task.await(hashtag_task)
+    direct_activity = Task.await(activity_fetch_task)
+
+    activity_results =
+      if direct_activity == nil do
+        activity_results
+      else
+        [direct_activity | activity_results]
+      end
 
     %{
       "accounts" =>