2013-06-21 25 views
0

我在我的rails项目中使用了轮胎和elasticsearch,这是一个汽车零部件的零售网站。 ES正在为用于浏览零件目录的分面搜索页面提供动力。我的问题是:如何才能使过滤条件只返回完全匹配,同时使用查询字符串搜索相同的字段,使用分析器只使用查询字符串?ElasticSearch:将查询字符串与术语过滤器结合起来

我希望这是有道理的。我将尝试提供一个示例:

问题中的模型/索引称为零件。假设一部分映射名为categoriessub_categories。如果用户选择制动类别和制动钳载波子类别(创造长期的过滤器),我必须确保从制动卡钳子类别部分是不是也回来了 - 这是一个独立的子类别。但是,我确实希望用户能够在搜索字段中简单地输入“刹车”之类的内容(创建一个query_string),并从所有这些类别中的产品中获取结果。

下面是从部分型号的相关代码:

def to_indexed_json 
    fits = fitments.try(:map) do |fit| 
     { 
     make: fit.try(:make).try(:name), 
     make_id: fit.try(:make).try(:id), 
     model: fit.try(:model).try(:name), 
     model_id: fit.try(:model).try(:id), 
     year: fit.year, 
     sub_model: fit.sub_model 
     } 
    end 
    { 
     id: id, 
     name: name, 
     description: description, 
     fitments: fits, 
     categories: root_categories, 
     sub_categories: sub_categories, 
     price: price, 
     condition_id: condition_id, 
     country_of_origin: country_of_origin, 
     brand: brand, 
     oem: oem, 
     thumb_url: part_images.first.try(:image).try(:thumb).try(:url), 
     city: user.try(:city), 
     inventory: inventory, 
     part_number: part_number, 
     user: user.try(:public_name) 
    }.to_json 
    end 

    mapping do 
    indexes :id, type: 'integer' 
    indexes :name, analyzer: 'snowball', boost: 40 
    indexes :description, analyzer: 'snowball', boost: 12 

    indexes :price, type: "integer" 
    indexes :country_of_origin, index: :not_analyzed 
    indexes :condition_id, type: "integer" 
    indexes :brand, index: :not_analyzed 
    indexes :oem, type: "boolean" 
    indexes :city, index: :not_analyzed 
    indexes :inventory, type: "integer" 
    indexes :part_number, index: :not_analyzed 
    indexes :user, index: :not_analyzed 

    indexes :thumb_url, index: :not_analyzed 

    indexes :fitments do 
     indexes :make 
     indexes :make_id, type: "integer" #, index: 'not_analyzed' 
     indexes :model 
     indexes :model_id, type: "integer" #, index: 'not_analyzed' 
     indexes :year, type: "integer" 
     indexes :sub_model 
    end 

    indexes :categories do 
     indexes :name, index: :not_analyzed 
     indexes :id, type: "integer" 
    end 

    indexes :sub_categories do 
     indexes :name, index: :not_analyzed 
     indexes :id, type: "integer" 
    end 

    end 

def search(params={}) 

    query_filters = [] 

    tire.search(:page => params[:page], :per_page => 20) do 

    query_filters << { :term => { 'fitments.make_id' => params[:make] }} if params[:make].present? 
    query_filters << { :term => { 'fitments.model_id' => params[:model] }} if params[:model].present? 
    query_filters << { :term => { 'categories.name' => params[:category] }} if params[:category].present? 
    query_filters << { :term => { 'sub_categories.name' => params[:sub_category] }} if params[:sub_category].present? 
    query_filters << { :term => { 'city' => params[:city] }} if params[:city].present? 
    query_filters << { :term => { 'condition_id' => params[:condition] }} if params[:condition].present? 
    query_filters << { :term => { 'brand' => params[:brand] }} if params[:brand].present? 
    query_filters << { :term => { 'oem' => params[:oem] }} if params[:oem].present? 

    query do 
     filtered do 
     query { 
      if params[:query].present? 
      string params[:query] 
      else 
      all 
      end 
     } 
     filter :and, query_filters unless query_filters.empty? 
     end 
    end 

    facet("categories") { terms 'categories.name', size: 50 } unless params[:category].present? 
    facet("cities") { terms 'city', size: 50 } unless params[:city].present? 
    if params[:category].present? && !params[:sub_category].present? 
     facet("sub_categories") { terms 'sub_categories.name', size: 50 } 
    end 
    facet("condition_id") { terms 'condition_id', size: 50 } unless params[:condition].present? 
    facet("brand") { terms 'brand', size: 50 } unless params[:brand].present? 
    facet("oem") { terms 'oem', size: 2 } unless params[:oem].present? 

    size params[:size] if params[:size] 

    end 
end 

回答

相关问题