Фильтрация результатов поиска Sphinx по диапазону дат - PullRequest
3 голосов
/ 10 декабря 2008

У меня есть Widget.title, Widget.publish_ в и Widget.unpublish_ в. Это рельсовое приложение с запущенной функцией мышления_сфинкса, индексируемой раз в ночь. Я хочу найти все виджеты, которые имеют в заголовке 'foo' и опубликованы (publish _at

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

Ответы [ 2 ]

9 голосов
/ 10 декабря 2008

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

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}
1 голос
/ 13 марта 2009

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

...