Implement search engine & service in backend

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel
2019-10-22 10:25:28 +02:00
parent 59caac86a1
commit b5f9518faf
10 changed files with 226 additions and 45 deletions

59
lib/service/search.ex Normal file
View File

@@ -0,0 +1,59 @@
defmodule Mobilizon.Service.Search do
@moduledoc """
Module to handle search service
"""
alias Mobilizon.Events.Event
alias Mobilizon.Storage.Repo
alias Ecto.Adapters.SQL
def insert_search_event(%Event{} = event) do
SQL.query(
Repo,
"""
INSERT INTO event_search(id, title, document) VALUES ($1, $2, (
SELECT
setweight(to_tsvector(unaccent($2)), 'A') ||
setweight(to_tsvector(unaccent(coalesce($4, ' '))), 'B') ||
setweight(to_tsvector(unaccent($3)), 'C')
)
);
""",
[
event.id,
event.title,
HtmlSanitizeEx.strip_tags(event.description),
get_tags_string(event)
]
)
end
def update_search_event(%Event{} = event) do
SQL.query(
Repo,
"""
UPDATE event_search
SET document =
(SELECT
setweight(to_tsvector(unaccent($2)), 'A') ||
setweight(to_tsvector(unaccent(coalesce($4, ' '))), 'B') ||
setweight(to_tsvector(unaccent($3)), 'C')
),
title = $2
WHERE id = $1;
""",
[
event.id,
event.title,
HtmlSanitizeEx.strip_tags(event.description),
get_tags_string(event)
]
)
end
defp get_tags_string(%Event{tags: tags}) do
tags
|> Enum.map(& &1.title)
|> Enum.join(" ")
end
end