Фильтрация результатов поиска Sphinx по диапазону дат

У меня есть Widget.title, Widget.publish_ at и Widget.unpublish_ at. Это приложение rails с запущенным Think_sphinx, индексирующим один раз за ночь. Я хочу найти все виджеты, в заголовке которых есть «foo», и которые опубликованы (опубликовать _at ‹ Time.now, отменить публикацию _at > Time.now).

Чтобы нумерация страниц работала правильно, я действительно хочу сделать это в запросе sphinx. У меня есть 'has :publish_at, :unpublish_at' для получения атрибутов, но каков синтаксис для 'Widget.search("foo @publish_ at > #{Time.now}",:match _mode=>:extended'? Это даже возможно?


person Gwyn Morfey    schedule 10.12.2008    source источник


Ответы (2)


Да, это легко возможно, просто убедитесь, что вы учитываете время в своих индексах:

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

Чтобы получить его, основываясь исключительно на датах, требуется небольшая хитрость из-за того, что sphinx требует ограниченного диапазона (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}
person Michael    schedule 10.12.2008
comment
Спасибо!! Я уже некоторое время с этим борюсь. - person Chelsea; 06.08.2009

Я еще не использовал sphinx с рельсами. Но это возможно с помощью Sphinx API. Что вам нужно сделать, так это установить атрибут datetime в вашем sphinx.conf. И не забудьте использовать UNIX_TIMESTAMP(publish_at), UNIX_TIMESTAMP(unpublish_at) при выборе индекса.

person Tiago    schedule 13.03.2009