ruby-on-rails - 使用gem Tire和ElasticSearch建立正确的搜索请求

标签 ruby-on-rails elasticsearch tire

我正在尝试为我的Flower Store实现简单的搜索请求,但是由于我是Tire和ElasticSearch的新手,所以我不知道该怎么做。

我有可搜索的模型Product和habtm模型CategoryColourFlower。我想要的是每个关联的复选框,产生与此类似的请求:

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

而且不知道如何配置它。我了解了filtersfacets,但是因为英语不是我的母语,所以我无法理解什么是什么以及如何使用它们。

最佳答案

我是这样做的:

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

关于ruby-on-rails - 使用gem Tire和ElasticSearch建立正确的搜索请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13071672/

相关文章:

ruby-on-rails - Rails、路由和 REST

elasticsearch - elasticsearch术语查询未获取所有文档

elasticsearch - 如果搜索查询包含弹性的特定术语/文本,如何 boost 某些文档

ruby-on-rails - 将 searchkick 与 elasticsearch 插件一起使用

ruby-on-rails - 缺少 application.yml 文件 - Atom 隐藏 vcs 忽略的文件

ruby-on-rails - 为什么我的夹具对象在我的 Rails Test::Unit 测试中不可用?

elasticsearch - 如何从弹性嵌套中排除某些值

ruby-on-rails - Tire找不到部分单词(在2个字段中搜索)

elasticsearch - 多字构面(ElasticSearch + Tire)

javascript - 无休止的页面一遍又一遍地加载相同的记录