按日期范围过滤Sphinx搜索结果

时间:2008-12-10 12:50:30

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

我有Widget.title,Widget.publish_ at和Widget.unpublish_ at。这是一个使用thinking_sphinx运行的rails应用程序,每晚索引一次。我想找到标题中包含'foo'的所有小部件,并发布(发布_at< Time.now,取消发布_at> Time.now)。

为了让分页正常工作,我真的想在sphinx查询中执行此操作。我有 'has:publish_at,:unpublish_at'来获取属性,但是'Widget.search(“foo @publish_ at>#{Time.now}”的语法是什么,匹配_mode =>:extended'?这是甚至可能?

2 个答案:

答案 0 :(得分:9)

是的,很容易实现,只需确保覆盖索引中的时间:

class Widget < ActiveRecord::Base
  define_index do
    indexes title
    has publish_at
    has unpublish_at
    ...
  end

为了完全基于日期拉动它,由于狮身人面像需要有界范围(x..y而不是x> = y),因此需要少量技巧。使用最小/最大值是非常不优雅的,但我现在还没有意识到它的好方法。

min_time = Time.now.advance(:years => -10)
max_time = Time.now.advance(:years => 10)
title = "foo"

Widget.search title, :with => {:publish_at => min_time..Time.now, :unpublish_at => Time.now..max_time}

答案 1 :(得分:1)

我还没有使用sphinx和rails。 但这可以通过Sphinx API实现。 您需要做的是在sphinx.conf中设置datetime属性。 并且不要忘记在索引选择中使用UNIX_TIMESTAMP(publish_at),UNIX_TIMESTAMP(unpublish_at)。