Ruby on rails 斯芬克斯排序的思考

Ruby on rails 斯芬克斯排序的思考,ruby-on-rails,sphinx,thinking-sphinx,Ruby On Rails,Sphinx,Thinking Sphinx,我有一个要求,我希望根据传递给sphinx的ID顺序获得结果: 我用ruby进行了排序和过滤,然后找到用户ID的顺序 user_ids = [1, 3, 2] 现在,我想在此基础上应用搜索: User.search_for_ids("Test", {:with => {:page => params[:page], :per_page => 25, :sphinx_internal_id => user_ids}, :sql => {:order => "f

我有一个要求,我希望根据传递给sphinx的ID顺序获得结果:

我用ruby进行了排序和过滤,然后找到用户ID的顺序

user_ids = [1, 3, 2]
现在,我想在此基础上应用搜索:

User.search_for_ids("Test", {:with => {:page => params[:page], :per_page => 25, :sphinx_internal_id => user_ids}, :sql => {:order => "field(id,#{user_ids.join(',')})"}})
我发现当我们需要对sql进行排序时,可以在选项中传递:sql=>:order。但这并没有给出预期排序顺序的结果

User.where(:id =>  [1, 2, 3]).order("field(id,#{user_ids.join(',')})") 
给我预期的正确结果


如果我在这里做错了什么,请纠正我。有没有办法保留用户ID的顺序?非常感谢您提供的任何帮助。

我不相信有一种用于预定排序顺序的内置机制,但您可以在返回搜索结果后进行排序。显然,如果您使用任何类型的分页,这都不会很好地工作:

user_ids = [1,3,2]
results = User.search_for_ids #...
results.sort_by {|result| user_ids.index(result.id) }

我知道我的修复不是最优的,但我最终还是做了下面的代码。考虑到斯芬克斯的速度有多快,管理费用似乎并不太高。Zach的回答很好,但我还需要加载几个模型

product_ids = Product.seach_for_ids(term)
products = Product.includes(:manufacturer, :images, :items).where(:id => product_ids).order("field(ID,#{product_ids.join(",")})")
假设您使用的是will_paginate gem,您应该能够在最后拍打paginate,因为您将有一个arel对象

products = Product.includes(:manufacturer, :images, :items).where(:id => product_ids).order("field(ID,#{product_ids.join(",")})").paginate

正如在评论中提到的,这可能与一些嵌套的IF函数有关,但是您真的只有三个用户ID吗?或者ID列表可以更长?ID列表可以更长。它最多可以有10万个ID..嗯,你可能会这么做。我怀疑sphinx是否会允许您使用100k嵌套if语句——这是一个堆栈溢出!我想您可能很幸运使用了UDF,但可以想象它会很慢,而且很难优化。是否真的没有办法将其作为属性嵌入?