From 7e877bc49ff50cdaba9d005489774262ccd01441 Mon Sep 17 00:00:00 2001 From: Erik Hatcher Date: Sun, 28 Jan 2007 10:15:08 +0000 Subject: [PATCH] Add more features to the UI: inverting/removing of filters and queries, Ajax suggestion of terms. git-svn-id: https://svn.apache.org/repos/asf/lucene/solr/trunk@500769 13f79535-47bb-0310-9956-ffa450edef68 --- .../app/controllers/browse_controller.rb | 92 +++++++++++++++---- .../flare/app/views/browse/_suggest.rhtml | 9 ++ .../ruby/flare/app/views/browse/index.rhtml | 49 ++++++++-- .../ruby/flare/app/views/layouts/browse.rhtml | 3 +- client/ruby/flare/config/environment.rb | 2 +- 5 files changed, 125 insertions(+), 30 deletions(-) create mode 100755 client/ruby/flare/app/views/browse/_suggest.rhtml diff --git a/client/ruby/flare/app/controllers/browse_controller.rb b/client/ruby/flare/app/controllers/browse_controller.rb index 248cba3371c..1e3f1ecdc49 100644 --- a/client/ruby/flare/app/controllers/browse_controller.rb +++ b/client/ruby/flare/app/controllers/browse_controller.rb @@ -5,35 +5,58 @@ class BrowseController < ApplicationController before_filter :setup_session def index - request = Solr::Request::Standard.new :query => session[:queries].join(' AND '), :filter_queries => session[:filters] - @results = SOLR.send(request).data + @info = SOLR.send(Solr::Request::IndexInfo.new) # TODO move this call to only have it called when the index may have changed + @facet_fields = @info.field_names.find_all {|v| v =~ /_facet$/} + + request = Solr::Request::Standard.new :query => query, + :filter_queries => filters, + :facets => {:fields => @facet_fields, :limit => 20 , :mincount => 1, :sort => :count, :debug_query=>true} + @response = SOLR.send(request) + + #TODO: call response.field_facets(??) - maybe field_facets should be return a higher level? end def facet - @field = "#{params[:field]}_facet" - req = Solr::Request::Standard.new(:query => session[:queries].join(' AND '), - :filter_queries => session[:filters], - :facets => {:fields => [@field], - :mincount => 1, :sort => :count - }, - :rows => 0 - ) - - results = SOLR.send(req) - - @facets = results.data['facet_counts']['facet_fields'][@field] + @facets = retrieve_field_facets("#{params[:field]}") end + def auto_complete_for_search_query + # TODO instead of "text", default to the default search field configured in schema.xml + @values = retrieve_field_facets("text", 5, params['search']['query'].downcase) + + render :partial => 'suggest' + end + + def add_query - if session[:queries].size == 1 - session[:queries] = [] if session[:queries][0] == "[* TO *]" - end - session[:queries] << params[:query] + session[:queries] << {:query => params[:search][:query]} + redirect_to :action => 'index' + end + + def invert_query + q = session[:queries][params[:index].to_i] + q[:negative] = !q[:negative] + redirect_to :action => 'index' + end + + def remove_query + session[:queries].delete_at(params[:index].to_i) + redirect_to :action => 'index' + end + + def invert_filter + f = session[:filters][params[:index].to_i] + f[:negative] = !f[:negative] + redirect_to :action => 'index' + end + + def remove_filter + session[:filters].delete_at(params[:index].to_i) redirect_to :action => 'index' end def add_filter - session[:filters] << "#{params[:field]}:#{params[:value]}" + session[:filters] << {:field => params[:field], :value => params[:value]} redirect_to :action => 'index' end @@ -46,7 +69,36 @@ class BrowseController < ApplicationController private def setup_session - session[:queries] = ["[* TO *]"] if session[:queries] == nil || session[:queries] .empty? + session[:queries] ||= [] session[:filters] ||= [] end + + def retrieve_field_facets(field, limit=-1, prefix=nil) + req = Solr::Request::Standard.new(:query => query, + :filter_queries => filters, + :facets => {:fields => [field], + :mincount => 1, :limit => limit, :prefix => prefix + }, + :rows => 0 + ) + + results = SOLR.send(req) + + results.field_facets(field) + end + + def query + queries = session[:queries] + if queries.nil? || queries.empty? + query = "[* TO *]" + else + query = session[:queries].collect{|q| "#{q[:negative] ? '-' : ''}(#{q[:query]})"}.join(' AND ') + end + + query + end + + def filters + session[:filters].collect {|filter| "#{filter[:negative] ? '-' : ''}#{filter[:field]}:\"#{filter[:value]}\""} + end end diff --git a/client/ruby/flare/app/views/browse/_suggest.rhtml b/client/ruby/flare/app/views/browse/_suggest.rhtml new file mode 100755 index 00000000000..404fc4e1c02 --- /dev/null +++ b/client/ruby/flare/app/views/browse/_suggest.rhtml @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/client/ruby/flare/app/views/browse/index.rhtml b/client/ruby/flare/app/views/browse/index.rhtml index 126f6d9866c..4ea7091937f 100644 --- a/client/ruby/flare/app/views/browse/index.rhtml +++ b/client/ruby/flare/app/views/browse/index.rhtml @@ -1,14 +1,47 @@ <% form_tag(:action=>'add_query') do %> - Query: <%=text_field_tag 'query'%> + Query: <%= text_field_with_auto_complete :search, :query %> <% end %> <%=link_to 'clear constraints', :action => 'clear'%> -Queries: <%=session[:queries].join(' AND ')%> -Filters: <%=session[:filters].join(' >>> ')%> - -Found: <%=@results['response']['numFound']%> +
+Queries: +
+
+Filters: + +
+

facets

+
+<% @facet_fields.each do |field|%> +
+ <%=field%>: + <% @response.field_facets(field).each do |k,v| %> + <%= link_to "#{k} (#{v})", :action => 'add_filter', :field=>field, :value=>k%> + <% end %> <%=link_to "more...", :action => 'facet', :field => field%> +
+<% end %> +
+

results

+
+Found: <%=@response.total_hits%> + -<%=debug @results['responseHeader']%> +
+

index info

<%=debug @info %> + +

search/facet response header

<%=debug @response.data['responseHeader']%> diff --git a/client/ruby/flare/app/views/layouts/browse.rhtml b/client/ruby/flare/app/views/layouts/browse.rhtml index 3c4c9f76960..2ff55354f89 100755 --- a/client/ruby/flare/app/views/layouts/browse.rhtml +++ b/client/ruby/flare/app/views/layouts/browse.rhtml @@ -1,6 +1,7 @@ - Flare: <%=controller.action_name%>> + Flare: <%=controller.action_name%> + <%= javascript_include_tag :defaults %> <%= yield %> diff --git a/client/ruby/flare/config/environment.rb b/client/ruby/flare/config/environment.rb index ee7f89da591..a5a6c0be6a8 100644 --- a/client/ruby/flare/config/environment.rb +++ b/client/ruby/flare/config/environment.rb @@ -54,7 +54,7 @@ end # end # Include your application configuration below -$KCODE = 'UTF8' +# $KCODE = 'UTF8' # Rails 1.2 supposedly sets this automatically require 'solr' SOLR = Solr::Connection.new("http://localhost:8983/solr")