如何基于Sphinx(Rails)中的字段值对搜索结果进行排序

时间:2013-02-06 21:04:13

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

我有一个方案,其中项目有计划,计划有许多不同的名称和截止日期。

鉴于我可以搜索项目并对项目字段值甚至多态字段值进行排序,我如何根据具有请求的计划名称的计划对结果进行排序。

简单地说,在Thinking-Sphinx中,我如何在匹配的时间表名称的截止日期前订购我的搜索结果,例如。我希望按“预订”(时间表)截止日期对项目进行分类。

这似乎在Sphinx中应该很简单,但它却在逃避我。我打算构建一个搜索后排序,它考虑了Schedule名称,但是更喜欢Sphinx排序。

我尝试了类似下面的内容,但它没有考虑附表名称。

class Project
   has_many :schedules

   define_index do
      has schedules.due_date, :type => :datetime, :as => :due_date
   end
end

$: Project.search(query, :order => "due_date desc", :match_mode => :extended)

有趣的是,我确实得到了结果(有些分类),但它不准确,可能是因为它没有考虑到一个项目的许多时间表,因此不是特定于字段值。我也考虑过使用“with”但是

有没有办法可以通过Thinking Sphinx实现这一目标? (我在Rails 2.3.x上,所以我正在思考 - sphinx 1.4.3。)

[编辑] 我已经使用< =>成功地对此搜索进行了排序。运营商,但需要查看计划。我也研究了表达式排序,但这只适用于正在搜索的模型的字段,我不知道我可以索引哪些可用。

2 个答案:

答案 0 :(得分:2)

来自Pat Allan:以我描述的方式来说,这是不可能的。应该搜索时间表。

请参阅Google小组讨论中的Pat answer。 “你正在考虑的方式不能用你的Sphinx做什么:Sphinx对字段或属性中不同数据片段之间的关系没有任何理解,所以没有什么可以将日程安排日期和日程表名称联系在一起在项目索引中。 我建议您在Schedule上搜索,然后,因为只有一个时间表名称和一个时间表到期日,你应该没问题。然后,您可以在搜索结果中使用该计划的项目。“

答案 1 :(得分:1)

我猜您必须使用

之类的查询

默认情况下,排序模式为asc,用于更改您需要指定的内容

Project.search <query>, :order => <attribute_name>, :sort_mode => :desc, :match_mode =>:extended

如果您想使用多个属性或Sphinx的排名分数,那么您需要使用:扩展排序模式。

Project.search <query>, :sort_mode => :extended, :order => "attribute_name DESC/ASC, @relevance DESC/ASC", :match_mode=> :extended

http://pat.github.com/ts/en/searching.html#sorting