轮胎问题和排序搜索

时间:2013-01-06 22:22:17

标签: ruby-on-rails elasticsearch tire

我正在尝试使用轮胎宝石进行排序搜索,但我总是收到此错误:

解析失败[找不到[占用]的映射以便排序]]

我的代码出了什么问题? 以下是我的用户模型

class User
  include Mongoid::Document
  include Mongoid::Timestamps
  include Tire::Model::Search
  include Tire::Model::Callbacks

  belongs_to :occupation

  field :name, :type => String, :default => ""
  field :email, :type => String, :default => ""
  field :kind, :type => String, :default => ""

  def to_indexed_json
    { id: id,
      name: name,
      email: email,
      kind: kind,
      occupation: occupation.try(:name),
      created_at: created_at,
      updated_at: updated_at
    }.to_json
  end

  mapping do
    indexes :id, :type => 'integer'
    indexes :name, :type => 'String'
    indexes :email, :type => 'String'
    indexes :kind, :type => 'String'
    indexes :occupation, :type => 'String'
    indexes :created_at, :type => 'Date'
    indexes :updated_at, :type => 'Date'
  end

  def self.search q, params={}
    tire.search page: (params[:page] || 1)  do |search|
      search.query do |query|
        query.string q
      end
      search.sort do |sort|
        sort_column = params[:sort] || 'occupation'
        sort_direction = params[:direction] || 'asc'
        sort.by(sort_column.to_sym, sort_direction)
      end
    end
  end
end

1 个答案:

答案 0 :(得分:0)

你能试试吗?我猜你在to_indexed_json中发送了occupation.name,你试图对整个职业模型进行排序。

class User
  include Mongoid::Document
  include Mongoid::Timestamps
  include Tire::Model::Search
  include Tire::Model::Callbacks

  belongs_to :occupation

  field :name, :type => String, :default => ""
  field :email, :type => String, :default => ""
  field :kind, :type => String, :default => ""

  def to_indexed_json
    { id: id,
      name: name,
      email: email,
      kind: kind,
      occupation: occupation.try(:name),
      created_at: created_at,
      updated_at: updated_at
    }.to_json
  end

  mapping do
    indexes :id, :type => 'integer'
    indexes :name, :type => 'String'
    indexes :email, :type => 'String'
    indexes :kind, :type => 'String'
    indexes :occupation, :type => 'object' do
        indexes :name, :type => 'String'
    end
    indexes :created_at, :type => 'Date'
    indexes :updated_at, :type => 'Date'
  end

  def self.search q, params={}
    tire.search page: (params[:page] || 1)  do |search|
      search.query do |query|
        query.string q
      end
      search.sort do |sort|
        sort_column = params[:sort] || 'occupation.name'
        sort_direction = params[:direction] || 'asc'
        sort.by(sort_column, sort_direction)
      end
    end
  end
end