简体   繁体   中英

Building the right search request with gem Tire and ElasticSearch

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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM