[英]Building the right search request with gem Tire and ElasticSearch
我正在尝试为我的Flower Store实现简单的搜索请求,但是由于我不熟悉Tyre和ElasticSearch,所以我不知道该怎么做。
我有可搜索的模型Product
,以及habtm模型Category
, Colour
, Flower
。 我想要的是每个关联的复选框,产生与此类似的请求:
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
但是我只需要显示那些产品,这些产品:
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.
q
参数用于搜索在关联名称(例如, red roses bouquet
)中输入到文本字段的任何文本,并以较高的条件显示它。
现在我只有
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
而且不知道如何配置它。 我阅读了有关filters
和facets
,但是由于英语不是我的母语,所以我无法理解什么是什么以及如何使用它们。
我是这样做的:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.