【问题标题】:Thinking Sphinx - Sort order思考狮身人面像 - 排序顺序
【发布时间】:2013-10-07 07:00:26
【问题描述】:

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

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

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(',')})") 

按预期给我正确的结果

如果我在这里做错了什么,请纠正我。有没有办法保留关于 user_ids 的订单?非常感谢任何帮助。

【问题讨论】:

  • 正如 cmets 中所指出的那样,这可能会出现在一些嵌套的 IF 函数中,但是您真的只有三个 user_id 还是 id 列表可以更长?
  • ID 列表真的可以更长。最多可以有 100K 个 ID。
  • 嗯,那你可能是 SOL。我怀疑 sphinx 会让你使用 100k 嵌套的 if 语句 - 相当恰当的是堆栈溢出!我想你可能对 UDF 很幸运,但会想象它会很慢,而且很难优化。真的没有办法将其嵌入为属性吗?

标签: ruby-on-rails sphinx thinking-sphinx


【解决方案1】:

我不相信有预先确定的排序顺序的内置机制,但是您可以在返回搜索结果后进行排序。显然,如果您使用任何类型的分页,这将无法正常工作:

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

【讨论】:

    【解决方案2】:

    我知道我的修复不是最佳的,但我最终做了类似下面的代码。考虑到“快速”狮身人面像的间接费用似乎并不太高。 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,您应该能够在最后进行分页,因为您将拥有一个 arel 对象

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 2012-03-17
      • 1970-01-01
      相关资源
      最近更新 更多