我使用轮胎在 Rails 应用程序中进行搜索。假设我在索引中有这些值:
-- value -- time
red shoes 3 weeks ago
red car yesterday
red blue car 6 months ago
如何提升结果以便搜索red
将显示最新值?
- 红车
- 红鞋子
- 红蓝车
它不像按时间排序那么简单,因为搜索red blue
应该返回
- 红蓝车(虽然很旧,但有2个搜索词的事实应该超过其他人的新鲜度)
- 红车
- 红鞋子
我意识到我总是可以在轮胎查找结果后重新订购结果,但我只是想知道轮胎是否可以为我做这件事。我觉得我必须通过 a Proc
to:boost
因为Time.now
必须在搜索时进行评估 - 但我认为:boost
不能接受 a Proc
。
mapping(:date_detection => false) do
indexes :id, :index => :not_analyzed
indexes :label, :type => 'string', :analyzer => :label_analyzer
indexes :booked_date, :type => 'date', :index => :not_analyzed
end
def self.search(q)
tire.search do
query do
boolean do
should { string "label:#{q}", boost: -> { #use Time.now and :booked_date to determine a boost } }
end
end
# sort { by :booked_date, 'desc'}
end
end
更新基于接受的答案。这可以解决问题:
def self.search(q)
tire.search do
query do
boolean do
should { string "label:#{q}" }
should { range :booked_date, { from: "now-6M", boost: 4}}
should { range :booked_date, { from: "now-3M", boost: 5}}
end
end
end
end
谢谢