【问题标题】:Thinking Sphinx with a date range用日期范围思考狮身人面像
【发布时间】:2010-06-01 18:05:53
【问题描述】:

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

我现在想实现一个日期范围搜索,并不断收到“bad value for range”错误。

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

    @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'

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

【问题讨论】:

    标签: ruby-on-rails thinking-sphinx


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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!

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

      【讨论】:

        【解决方案3】:

        如果你替换它会不会工作

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

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

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

        【讨论】:

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