retrospring/app/controllers/search_controller.rb

36 lines
981 B
Ruby
Raw Normal View History

class SearchController < ApplicationController
def index
@results = []
@query = params[:q]
return if @query.blank?
@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)
end
end