2

我使用轮胎在 Rails 应用程序中进行搜索。假设我在索引中有这些值:

-- value       -- time
red shoes      3 weeks ago
red car        yesterday
red blue car   6 months ago

如何提升结果以便搜索red将显示最新值?

  1. 红车
  2. 红鞋子
  3. 红蓝车

它不像按时间排序那么简单,因为搜索red blue应该返回

  1. 红蓝车(虽然很旧,但有2个搜索词的事实应该超过其他人的新鲜度)
  2. 红车
  3. 红鞋子

我意识到我总是可以在轮胎查找结果后重新订购结果,但我只是想知道轮胎是否可以为我做这件事。我觉得我必须通过 a Procto: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

谢谢

4

1 回答 1

1

我不知道轮胎,但是像这样的查询会满足您的要求,但是您必须自己定义时间段。

"query": {
  "bool": {
    "must": [{ //your query goes here }]
    "should": [
      {
         "range": {
           "timefield": {
             "from": "now-1d",
             "boost": 3.0
           }
         }
      },
      {
         "range": {
           "timefield": {
             "from": "now-1w",
             "boost": 2.0
           }
         }
      },
      {
         "range": {
           "timefield": {
             "from": "now-1M",
             "boost": 1.0
           }
         }
      }
    ]
  }
}

查看日期数学表达式的文档

祝你好运!

于 2013-07-24T16:52:17.447 回答