add extra filters
This commit is contained in:
parent
3478492945
commit
345eb7b3f8
2 changed files with 78 additions and 4 deletions
|
@ -2,6 +2,10 @@ defmodule Pleroma.Elasticsearch do
|
||||||
alias Pleroma.Activity
|
alias Pleroma.Activity
|
||||||
alias Pleroma.Elasticsearch.DocumentMappings
|
alias Pleroma.Elasticsearch.DocumentMappings
|
||||||
|
|
||||||
|
@searchable [
|
||||||
|
"hashtag", "instance", "user"
|
||||||
|
]
|
||||||
|
|
||||||
defp url do
|
defp url do
|
||||||
Pleroma.Config.get([:elasticsearch, :url])
|
Pleroma.Config.get([:elasticsearch, :url])
|
||||||
end
|
end
|
||||||
|
@ -34,12 +38,82 @@ defmodule Pleroma.Elasticsearch do
|
||||||
)
|
)
|
||||||
end
|
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
|
||||||
|
|
||||||
|
defp search_user(params, q) do
|
||||||
|
if q["user"] != nil do
|
||||||
|
params ++ [%{match: %{user: %{
|
||||||
|
query: Enum.join(q["user"], " "),
|
||||||
|
operator: "OR"
|
||||||
|
}}}]
|
||||||
|
else
|
||||||
|
params
|
||||||
|
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
|
||||||
|
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)
|
||||||
|
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()
|
||||||
|
end
|
||||||
|
|
||||||
def search(query) do
|
def search(query) do
|
||||||
|
q = %{query: %{
|
||||||
|
bool: %{
|
||||||
|
must: parse(query)
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
IO.inspect(q)
|
||||||
Elastix.Search.search(
|
Elastix.Search.search(
|
||||||
url(),
|
url(),
|
||||||
"activities",
|
"activities",
|
||||||
["activity"],
|
["activity"],
|
||||||
%{query: %{term: %{content: query}}}
|
q
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -56,9 +56,9 @@ defmodule Pleroma.Web.MastodonAPI.SearchController do
|
||||||
defp elasticsearch_search(%{assigns: %{user: user}} = conn, query, options) do
|
defp elasticsearch_search(%{assigns: %{user: user}} = conn, query, options) do
|
||||||
with {:ok, raw_results} <- Pleroma.Elasticsearch.search(query) do
|
with {:ok, raw_results} <- Pleroma.Elasticsearch.search(query) do
|
||||||
results = raw_results
|
results = raw_results
|
||||||
|> Map.get(:body)
|
|> Map.get(:body, %{})
|
||||||
|> Map.get("hits")
|
|> Map.get("hits", %{})
|
||||||
|> Map.get("hits")
|
|> Map.get("hits", [])
|
||||||
|> Enum.map(fn result -> result["_id"] end)
|
|> Enum.map(fn result -> result["_id"] end)
|
||||||
|> Pleroma.Activity.all_by_ids_with_object()
|
|> Pleroma.Activity.all_by_ids_with_object()
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue