2008-12-10 7 views
3

J'ai Widget.title, Widget.publish_ at et Widget.unpublish_ at. C'est une application de rails avec le fonctionnement de thinking_sphinx, indexant une fois par nuit. Je veux trouver tous les Widgets qui ont 'foo' dans le titre, et sont publiés (publier _at < Time.now, unpublish _at> Time.now).Filtrage des résultats de recherche Sphinx par plage de dates

Pour que la pagination fonctionne correctement, je veux vraiment le faire dans une requête sphinx. J'ai 'a: publish_at,: unpublish_at' pour obtenir les attributs, mais quelle est la syntaxe de 'Widget.search ("foo @publish_ at> # {Time.now}" ,: match _mode =>: extended'? ce même possible

Répondre

9

Oui, facilement possible, assurez-vous que vous êtes couvrant les temps dans vos index:

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

Pour tirer purement basée hors des dates, une petite quantité de supercherie est nécessaire en raison à sphinx nécessitant une plage bornée (x..y par opposition à x> = y) L'utilisation de la valeur min/max est très inélégante, mais je ne suis pas au courant d'un bon moyen de le contourner pour l'instant

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

Merci! Je me bats avec ça depuis un moment maintenant. – Chelsea

1

Je n'ai pas encore utilisé de sphinx avec des rails. Mais c'est possible avec l'API Sphinx. Ce que vous devez faire est de définir un attribut datetime sur votre sphinx.conf. Et n'oubliez pas d'utiliser UNIX_TIMESTAMP (publish_at), UNIX_TIMESTAMP (unpublish_at) lors de votre sélection d'index.

Questions connexes