Extract search query into own class

This commit is contained in:
Lars Henrik Mai 2015-10-05 21:12:59 +02:00
parent 6381136bf2
commit 2ec222281c
2 changed files with 65 additions and 53 deletions

View file

@ -62,59 +62,7 @@ class Paper < ActiveRecord::Base
# see https://github.com/elastic/elasticsearch-ruby/tree/master/elasticsearch-dsl # see https://github.com/elastic/elasticsearch-ruby/tree/master/elasticsearch-dsl
# and https://github.com/elastic/elasticsearch-rails/tree/master/elasticsearch-rails/lib/rails/templates # and https://github.com/elastic/elasticsearch-rails/tree/master/elasticsearch-rails/lib/rails/templates
def search(q, options={}) def search(q, options={})
@search_definition = Elasticsearch::DSL::Search.search do @search_definition = PaperSearch.definition(q, options)
query do
# search query
unless q.blank?
multi_match do
query q
fields ["name", "content"]
end
else
match_all
end
end
# apply filter after aggregations
post_filter do
bool do
must { term paper_type: options[:paper_type] } if options[:paper_type].present?
must { term originator: options[:originator] } if options[:originator].present?
# catchall when no filters set
must { match_all } if options.keys.none? {|k| [:paper_type, :originator].include?(k) }
end
end
aggregation :paper_types do
# filter by originator
f = Elasticsearch::DSL::Search::Filters::Bool.new
f.must { match_all }
f.must { term originator: options[:originator] } if options[:originator].present?
filter f.to_hash do
aggregation :paper_types do
terms do
field 'paper_type'
end
end
end
end
aggregation :originators do
# filter by paper_type
f = Elasticsearch::DSL::Search::Filters::Bool.new
f.must { match_all }
f.must { term paper_type: options[:paper_type] } if options[:paper_type].present?
filter f.to_hash do
aggregation :originators do
terms do
field 'originator'
end
end
end
end
end
Rails.logger.debug "Query: #{@search_definition.to_json}" Rails.logger.debug "Query: #{@search_definition.to_json}"
__elasticsearch__.search(@search_definition) __elasticsearch__.search(@search_definition)
end end

View file

@ -0,0 +1,64 @@
class PaperSearch
def self.definition(q, options={})
Elasticsearch::DSL::Search.search do
sort do
if options[:sort_by] == 'date'
by :published_at, order: 'desc'
end
by '_score'
end
query do
# search query
unless q.blank?
multi_match do
query q
fields ["name", "content"]
end
else
match_all
end
end
# apply filter after aggregations
post_filter do
bool do
must { term paper_type: options[:paper_type] } if options[:paper_type].present?
must { term originator: options[:originator] } if options[:originator].present?
# catchall when no filters set
must { match_all } if options.keys.none? {|k| [:paper_type, :originator].include?(k) }
end
end
aggregation :paper_types do
# filter by originator
f = Elasticsearch::DSL::Search::Filters::Bool.new
f.must { match_all }
f.must { term originator: options[:originator] } if options[:originator].present?
filter f.to_hash do
aggregation :paper_types do
terms do
field 'paper_type'
end
end
end
end
aggregation :originators do
# filter by paper_type
f = Elasticsearch::DSL::Search::Filters::Bool.new
f.must { match_all }
f.must { term paper_type: options[:paper_type] } if options[:paper_type].present?
filter f.to_hash do
aggregation :originators do
terms do
field 'originator'
end
end
end
end
end
end
end