attempt to add pg_search
this commit is an attempt at building a search functionality using only
the stuff provided by postgresql
it is, unfortunately, painfully slow:
PgSearch::Document Load (7869.1ms) SELECT "pg_search_documents".* FROM "pg_search_documents" INNER JOIN (SELECT "pg_search_documents"."id" AS pg_search_id, (ts_rank((to_tsvector('simple', coalesce("pg_search_documents"."content"::text, ''))), (to_tsquery('simple', ''' ' || 'awoo' || ' ''')), 0)) AS rank FROM "pg_search_documents" WHERE ((to_tsvector('simple', coalesce("pg_search_documents"."content"::text, ''))) @@ (to_tsquery('simple', ''' ' || 'awoo' || ' ''')))) AS pg_search_ce9b9dd18c5c0023f2116f ON "pg_search_documents"."id" = pg_search_ce9b9dd18c5c0023f2116f.pg_search_id ORDER BY pg_search_ce9b9dd18c5c0023f2116f.rank DESC, "pg_search_documents"."id" ASC LIMIT $1 [["LIMIT", 10]]
2023-10-22 18:13:26 +02:00
|
|
|
class SearchController < ApplicationController
|
|
|
|
def index
|
|
|
|
@results = []
|
2023-10-22 19:39:18 +02:00
|
|
|
@query = params[:q]
|
|
|
|
return if @query.blank?
|
attempt to add pg_search
this commit is an attempt at building a search functionality using only
the stuff provided by postgresql
it is, unfortunately, painfully slow:
PgSearch::Document Load (7869.1ms) SELECT "pg_search_documents".* FROM "pg_search_documents" INNER JOIN (SELECT "pg_search_documents"."id" AS pg_search_id, (ts_rank((to_tsvector('simple', coalesce("pg_search_documents"."content"::text, ''))), (to_tsquery('simple', ''' ' || 'awoo' || ' ''')), 0)) AS rank FROM "pg_search_documents" WHERE ((to_tsvector('simple', coalesce("pg_search_documents"."content"::text, ''))) @@ (to_tsquery('simple', ''' ' || 'awoo' || ' ''')))) AS pg_search_ce9b9dd18c5c0023f2116f ON "pg_search_documents"."id" = pg_search_ce9b9dd18c5c0023f2116f.pg_search_id ORDER BY pg_search_ce9b9dd18c5c0023f2116f.rank DESC, "pg_search_documents"."id" ASC LIMIT $1 [["LIMIT", 10]]
2023-10-22 18:13:26 +02:00
|
|
|
|
2023-10-22 19:39:18 +02:00
|
|
|
@results = if params[:multi_search] == "1"
|
|
|
|
multi_search_experiment
|
|
|
|
else
|
|
|
|
[*Answer.search(@query), *Question.search(@query)]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def multi_search_experiment
|
|
|
|
MeiliSearch::Rails.client.multi_search(
|
|
|
|
[Answer, Question].map do |klass|
|
|
|
|
{
|
|
|
|
q: @query,
|
|
|
|
index_uid: klass.name.to_s,
|
|
|
|
show_ranking_score: true,
|
|
|
|
}
|
|
|
|
end
|
|
|
|
)["results"].flat_map do |h|
|
|
|
|
model = h["indexUid"].constantize # bad practice!
|
|
|
|
results = model.find(h["hits"].pluck("id")).map { |r| [r.id.to_s, r] }.to_h
|
|
|
|
h["hits"].map { |hit| [hit["_rankingScore"], results[hit["id"]]] }
|
|
|
|
end
|
|
|
|
.sort_by(&:first)
|
|
|
|
.reverse
|
|
|
|
.tap { |results| Rails.logger.debug(results) }
|
|
|
|
.map(&:last)
|
attempt to add pg_search
this commit is an attempt at building a search functionality using only
the stuff provided by postgresql
it is, unfortunately, painfully slow:
PgSearch::Document Load (7869.1ms) SELECT "pg_search_documents".* FROM "pg_search_documents" INNER JOIN (SELECT "pg_search_documents"."id" AS pg_search_id, (ts_rank((to_tsvector('simple', coalesce("pg_search_documents"."content"::text, ''))), (to_tsquery('simple', ''' ' || 'awoo' || ' ''')), 0)) AS rank FROM "pg_search_documents" WHERE ((to_tsvector('simple', coalesce("pg_search_documents"."content"::text, ''))) @@ (to_tsquery('simple', ''' ' || 'awoo' || ' ''')))) AS pg_search_ce9b9dd18c5c0023f2116f ON "pg_search_documents"."id" = pg_search_ce9b9dd18c5c0023f2116f.pg_search_id ORDER BY pg_search_ce9b9dd18c5c0023f2116f.rank DESC, "pg_search_documents"."id" ASC LIMIT $1 [["LIMIT", 10]]
2023-10-22 18:13:26 +02:00
|
|
|
end
|
|
|
|
end
|