2008-12-10 7 views
3

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

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

ответ

9

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

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

Чтобы вытащить его на основе чисто от даты, небольшое количество обмана требуется из-за для сфинкса, требующего ограниченного диапазона (x..y в отличие от x> = y). Использование значения min/max очень неэлегантно, но на данный момент я не знаю об этом неплохо.

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} 
+0

Спасибо! Я уже некоторое время сражаюсь с этим. – Chelsea 2009-08-06 17:25:50

1

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