7

我正在为我的 Rails 应用程序实现一个全文搜索 API,到目前为止,Thinking Sphinx 取得了巨大的成功。

我现在想实现日期范围搜索,并不断收到“范围错误”错误。

这是控制器代码的片段,我有点不知道下一步该做什么。

    @search_options = { :page => params[:page], :per_page => params[:per_page]||50 }

    unless params[:since].blank?
        # make sure date is in specified format - YYYY-MM-DD
        d = nil
        begin
            d = DateTime.strptime(params[:since], '%Y-%m-%d')
        rescue
            raise ArgumentError, "Value for since parameter is not a valid date - please use format YYYY-MM-DD"
        end
        @search_options.merge!(:with => {:post_date => d..Time.now.utc})
    end
    logger.info @search_options
    @posts = Post.search(params[:q], @search_options)

当我查看日志时,我看到这一位似乎暗示日期尚未转换为与 Time.now.utc 相同的时间格式。

withpost_date2010-05-25T00:00:00+00:00..Tue Jun 01 17:45:13 UTC 2010

有任何想法吗?基本上,我试图让 API 请求在“自”日期传递,以查看某个日期之后的所有帖子。我指定日期应为 YYYY-MM-DD 格式。

谢谢你的帮助。克里斯

编辑: 我刚刚将日期参数合并语句更改为此

@search_options.merge!(:with => {:post_date => d.to_date..DateTime.now})

现在我得到这个错误

2010 年 5 月 25 日星期二的未定义方法“to_i”:日期

所以显然有些东西仍然没有设置正确......

4

3 回答 3

8

让我们说d = "2010-12-10"

:post_date => (d.to_time.to_i..Time.now.to_i)会把你带到那里的。我刚刚在我的项目中做了这个,效果很好

于 2010-12-09T17:53:03.227 回答
2

我终于解决了这个问题,但它采用了稍微不同的方法,但效果很好。

我试图将日期范围搜索放在 sphinx_scope (在模型中)或作为 :condition 或 :with (在控制器中)。这不起作用,所以我不得不在模型的 define_index 中实现它。

所以我所做的是在define_index 中进行检查以查看记录是否在某个日期范围内,该日期范围由一些SQL 代码定义,如下所示。在这种情况下,我想看看“start_date”是否在现在和 30 天前之间的日期内,而“end_date”是否在今天和从现在起 30 天之间。

如果日期在范围内,下面的代码会导致 :live 为 0 或 1,具体取决于它是在日期范围之外还是在日期范围内(分别):

define index do
    # fields:
    ...
    # attributes:
    has "CASE WHEN start_date > DATE_ADD(NOW(), INTERVAL -30 DAY) AND end_date < DATE_ADD(NOW(), INTERVAL 30 DAY) THEN 1 ELSE 0 END", :type => :integer, :as => :live
    ...
    # delta:
    ...
end

然后在您的控制器中,您所要做的就是检查 if :live => 1 以获取在日期范围内具有 start_dates 和 end_dates 的所有记录。

我使用了这样的 sphinx_scope:

sphinx_scope(:live) {
    { :with => { :live => 1 } }
}

然后在我的控制器中:

@models = Model.live.search(...)

为确保它运行良好,您当然需要执行频繁的重新索引以确保索引是最新的,即正确的记录是 :live => 1 或 0!

无论如何,这对你来说可能有点晚了,但我实现了它,它就像一个魅力!

于 2010-09-28T16:13:03.203 回答
-1

换了就不行了

d = DateTime.strptime(params[:since], '%Y-%m-%d')

经过

Time.parse(params[:since]).strftime("%Y-%m-%d")

(似乎第一个没有以预期格式返回日期)

于 2010-12-09T18:38:05.197 回答