Reputation: 359
I am trying to implement simple search request for my Flower Store, but as I am new to Tire and ElasticSearch, I cannot get how to do it.
I have searchable model Product
, and habtm models Category
, Colour
, Flower
. What I want is checkboxes for each association, producing request similiar to this:
http://example.com/search?q=some%20query&category_names[]=bouquet&category_names[]=marriage&colour_names[]=red&colour_names[]=yellow&colour_names[]=white&flower_names[]=rose&flower_names[]=tulip&price_min=100&price_max=1000
But I need to show only those products, which:
a) prestent in any of the requested categories (OR);
b) have all of the requested colours (AND);
c) have all of the requested flowers (AND);
d) enter the price range between price_min and price_max.
The q
parameter is to search any text, entered to the text field, in the names of associations (let's say, red roses bouquet
), and show it with the upper criteria too.
For now I have only
class Product
include Mongoid::Document
include Tire::Model::Search
include Tire::Model::Callbacks
has_and_belongs_to_many :categories
has_and_belongs_to_many :colours
has_and_belongs_to_many :flowers
def self.search(params)
tire.search(load: true, page: params[:page], per_page: 8) do |search|
search.query { string params[:query] } if params[:query].present?
end
end
def to_indexed_json
self.to_json(methods: [:category_names, :colour_names])
end
def category_names
self.categories.collect { |c| c.name }
end
def colour_names
self.colours.collect { |c| c.name }
end
end
and do not know how to configure it. I read about filters
and facets
, but because English is not my native I cannot uderstand what is what and how to use them.
Upvotes: 0
Views: 620
Reputation: 359
I did it so:
def self.search(params)
tire.search(load: true, page: params[:page], per_page: 8) do
query do
boolean do
must { string params[:query], default_operator: "AND" } if params[:query].present?
must { string params[:category_names] } if params[:category_names].present?
must { string params[:colour_names], default_operator: "AND" } if params[:colour_names].present?
must { range :price, { gte: params[:price_min], lte: params[:price_max] } } if params[:price_min].present? && params[:price_max].present?
end
end
# raise to_curl
end
end
Upvotes: 1