# Ergebnis der SolR-Suche class MultiSolr::SearchResult attr_reader :hits, # Integer mit Anzahl der Treffer :hits_grouped, # Anzahl der Treffer über alle Gruppen (nur bei Suche mit Gruppierung) :metadata, # Hash mit Metadaten so wie sie vom SolR kommen (QTime u.a.) :facet_fields, # Hash(String,Array) mit Facet-Fields-Daten wenn angefordert :facet_ranges, # Hash(String,Array) mit Facet-Range-Daten wenn angefordert :stats, # Hash mit Stats-Daten wenn angefordert :stats_facets, # Hash mit Stats-Facet-Werten (wenn Facets über Stats-Componente gebildet wurden) :solr_result, # Original Solr-Result :search_request # Original SearchRequest attr_accessor :data_rows # Array(Hash) mit den gefundenen Daten-Zeilen # Params: # solr_result: Hash, so wie sie direkt vom SolR kommt # solr_search_request: der zugehörige Such-Request (eine Instance von MultiSolr::SearchRequest) # context: Context-Inforamtionen, so wie sie bei der Suchausführung angegeben wurden (siehe MultiSolr::BaseSearcher#execute) def initialize solr_result, solr_search_request, context @solr_result = solr_result @search_request = solr_search_request @context = context if solr_result['grouped'] parse_grouping_result else parse_non_grouping_result end if @hits && @hits > 0 parse_stats if solr_result.key?('stats') parse_facet_counts end rescue => ex MultiSolr.logger.warn "#{self.class.name}.initialize: #{ex}\n\t"+ex.backtrace[0..10].join("\n\t") MultiSolr.logger.warn solr_result.inspect end # Mapper facet_fields => facet_counts wegen Abwärtskompatibilität def facet_counts @facet_fields end def page @search_request.page end def total_pages return @_total_pages if @_total_pages @_total_pages, rest = @hits.divmod(@search_request.page_size) @_total_pages += 1 if rest > 0 @_total_pages end # Paginierung der Result-Docs als WillPaginate::Collection # Achtung! Dies bedingt das Gem "willpaginate". Dieses ist nicht als Abhängikeit definiert def paginate_result return if @data_rows.nil? || @data_rows.empty? @data_rows = WillPaginate::Collection.create(@search_request.page, @search_request.page_size) do |pager| pager.replace(@data_rows) pager.total_entries = @hits end end private def parse_non_grouping_result @metadata = @solr_result['response'] if @metadata @data_rows = @metadata.delete('docs') @metadata.merge!(@solr_result['responseHeader']) @hits = @metadata['numFound'].to_i end end def parse_grouping_result @metadata = @solr_result['responseHeader'] grouped_data = @solr_result['grouped'][@search_request.group_field] @data_rows = grouped_data['groups'] @hits = grouped_data['ngroups'].to_i @hits_grouped = grouped_data['matches'].to_i end def parse_facet_counts solr_facet_counts = @solr_result['facet_counts'] if MultiSolr.logger.debug? MultiSolr.logger.debug "parse_facet_counts: #{solr_facet_counts.inspect}" end return if solr_facet_counts.nil? @facet_fields = solr_facet_counts['facet_fields'] @facet_ranges = solr_facet_counts['facet_ranges'] end def parse_stats @stats = solr_result['stats']['stats_fields'] return if @stats.nil? # Parsen der evtl. Stats-Facets @stats.each do |stats_field, values| # z.B.: stats_field : 'volumen', values : {min : xxx, ..., facets : {...} } facets = values['facets'] next if facets.nil? @stats_facets ||= {} facets.each do |facet, facet_values| # z.B.: facet : 'saison', facet_values: { '125': {min:xxx, sum:xx, ....}, '121': {min:xxx, sum:xx, ....}} @stats_facets[facet] ||= {} stats_facet = @stats_facets[facet] facet_values.each do |facet_entry, entry_values| # z.B: facet_entry : '125', entry_values : {min:xxx, sum:xx, ....} # Dies wird nun umgemapt auf facet : facet_entry : stats_field : entry_values stats_facet[facet_entry] ||= {} stats_facet[facet_entry][stats_field] = entry_values end end end end end