stadtratmonitor/app/controllers/search_controller.rb

72 lines
2.1 KiB
Ruby
Raw Permalink Normal View History

2020-03-09 12:13:27 +01:00
# frozen_string_literal: true
SearchFacet = Struct.new('SearchFacet', :term, :count) do
def term_with_count
"#{term} (#{count})"
end
end
class SearchController < ApplicationController
def index
@search_definition = PaperSearch.new(search_params)
2020-03-09 12:13:27 +01:00
@search_definition.sort_by ||= 'date'
2015-06-22 20:38:24 +02:00
2015-10-10 09:48:18 +02:00
execute_search
end
def show
@search_definition = PaperSearch.find params[:id]
execute_search
2020-03-09 12:13:27 +01:00
render action: 'index'
2015-10-10 09:48:18 +02:00
end
private
def execute_search
@response = Paper.search(@search_definition.to_definition)
2015-06-13 21:18:55 +02:00
@papers = @response.page(params[:page]).results
2020-03-09 12:13:27 +01:00
@sub = {}
@papers.each do |paper|
2020-03-09 12:13:27 +01:00
next if paper.reference.nil? && paper.reference.contains('-')
2020-03-09 12:13:27 +01:00
segments = paper.reference.split('-')
id = ((paper.reference.start_with?('VI-') || paper.reference.start_with?('VII-')) && segments.count > 2 ?
segments[2] : segments[1])
escaped_chars = Regexp.escape('\\+-*:()[]{}&!?^|\/')
sanitized_id = id.gsub(/([#{escaped_chars}])/, '\\\\\1')
%w[AND OR NOT].each do |reserved|
escaped_reserved = reserved.split('').map { |c| "\\#{c}" }.join('')
sanitized_id = sanitized_id.gsub('/\s*\b(#{reserved.upcase})\b\s*/',
" #{escaped_reserved} ")
end
@sub_search_definition = Elasticsearch::DSL::Search.search do
query do
query_string do
query '*' + sanitized_id + '*'
fields ['reference']
end
end
2020-03-09 12:13:27 +01:00
sort do
by :published_at, order: 'desc'
by :reference, order: 'desc'
end
end
2020-03-09 12:13:27 +01:00
@sub_papers = Paper.search(@sub_search_definition)
@sub[paper.reference] = @sub_papers
end
2015-06-22 21:11:51 +02:00
@paper_type_facets = extract_facets('paper_types')
@originator_facets = extract_facets('originators')
end
2015-06-22 21:11:51 +02:00
2015-10-10 09:48:18 +02:00
def search_params
params.fetch(:paper_search, {}).permit(:query, :paper_type, :originator, :sort_by)
2015-10-10 09:48:18 +02:00
end
2015-06-22 21:11:51 +02:00
def extract_facets(name)
2020-03-09 12:13:27 +01:00
@response
.response['aggregations'][name.to_s][name.to_s]['buckets']
.map { |m| SearchFacet.new(m['key'], m['doc_count']) }
2015-06-22 21:11:51 +02:00
end
end