在 id 数组上无条件地思考 sphinx 是行不通的

Thinking sphinx without condition on array of id is not working

我正在使用 ruby 1.9.3p392 rails 3.2.21 thinking sphinx 3.1.0Sphinx 2.2.4-id64-release

user_index.rb 文件是:-

ThinkingSphinx::Index.define :user, :with => :active_record do
  indexes first_name, :sortable => true
  indexes last_name
  indexes email
  indexes user_name
  indexes company_id
  indexes id
  indexes user_type_id
  indexes department.name
  indexes department.id, :as => :department_id
end

当我搜索为:-

assigned_user_ids = [372, 373, 374, 375, 367, 376, 377, 378, 379, 380]
@users = User.search(Riddle::Query.escape(params[:search]), 
    :conditions => {:company_id => @company.id}, 
    :without => {:id => assigned_user_ids}, :per_page => PAGINATION_SIZE, 
    :page => params[:page])

但它仍然显示 userid = 372

这里有两个问题:

首先是您对任何非字符串数据使用字段而不是属性,这意味着某些过滤器无法可靠地工作。第二个问题是 id 被 Sphinx 内部使用,所以你要么使用 Thinking Sphinx 的自动属性 ​​sphinx_internal_id,要么为你自己的属性添加一个别名。

因此,我建议改用以下索引定义:

ThinkingSphinx::Index.define :user, :with => :active_record do
  indexes first_name, :sortable => true
  indexes last_name
  indexes email
  indexes user_name
  indexes department.name

  has company_id
  has user_type_id
  has department.id, :as => :department_id
end

然后您的搜索将是:

assigned_user_ids = [372, 373, 374, 375, 367, 376, 377, 378, 379, 380]
@users = User.search(Riddle::Query.escape(params[:search]), 
  :with     => {:company_id => @company.id}, 
  :without  => {:sphinx_internal_id => assigned_user_ids},
  :per_page => PAGINATION_SIZE, 
  :page     => params[:page]
)

在完全不相关的说明中:除非此搜索仅供管理员使用,否则我建议您不要在索引数据中包含电子邮件地址。在大多数情况下,允许人们通过电子邮件地址进行搜索存在安全风险。