2010-06-01 3 views
7

Я внедряю API полнотекстового поиска для своих приложений на rails и до сих пор имел большой успех с Thinking Sphinx.Мышление Sphinx с диапазоном дат

Теперь я хочу реализовать поиск диапазона дат и продолжать получать ошибку «плохое значение для диапазона».

Вот фрагмент кода контроллера, и я немного застрял в том, что делать дальше.

@search_options = { :page => params[:page], :per_page => params[:per_page]||50 } 

    unless params[:since].blank? 
     # make sure date is in specified format - YYYY-MM-DD 
     d = nil 
     begin 
      d = DateTime.strptime(params[:since], '%Y-%m-%d') 
     rescue 
      raise ArgumentError, "Value for since parameter is not a valid date - please use format YYYY-MM-DD" 
     end 
     @search_options.merge!(:with => {:post_date => d..Time.now.utc}) 
    end 
    logger.info @search_options 
    @posts = Post.search(params[:q], @search_options) 

Когда я взглянуть на журнал, я вижу этот бит, который, кажется, подразумевает дату не конвертируется в том же формате, что и Time.now.utc.

withpost_date2010-05-25T00:00:00+00:00..Tue Jun 01 17:45:13 UTC 2010 

Любые идеи? В основном я пытаюсь передать запрос API в дату «с», чтобы увидеть все сообщения после определенной даты. Я указываю, что дата должна быть в формате YYYY-MM-DD.

Благодарим за помощь. Chris

EDIT: Я только что изменил параметры даты слияния заявление по этому

@ search_options.merge! (: С => {: POST_DATE => d.to_date..DateTime.now})

и теперь я получаю эту ошибку

неопределенный метод `to_i» для вт, 25 мая 2010: Дата

Так, очевидно, есть что-то еще не настроен правильно ...

ответ

2

Я, наконец, решил это, но он требует немного другого подхода, но он отлично работает.

Я пытался установить поиск по дате в sphinx_scope (в модели) или в качестве: условия или: с (в контроллере). Это не сработало, поэтому вместо этого я должен был реализовать его внутри define_index в модели.

Итак, я сделал проверку в определении_индекса, чтобы увидеть, попала ли запись в диапазон дат, а диапазон дат определен некоторым кодом SQL, как показано ниже. В этом случае мне хотелось узнать, попало ли «start_date» в дату между 30 и 30 днями, а «end_date» упал сегодня и через 30 дней.

Если даты упали в пределах диапазонов, приведенный ниже код вызывает: жить, чтобы быть 0 или 1, в зависимости от того, попадает ли она снаружи или внутри диапазонов (соответственно):

define index do
    # fields:
    ...
    # attributes:
    has "CASE WHEN start_date > DATE_ADD(NOW(), INTERVAL -30 DAY) AND end_date < DATE_ADD(NOW(), INTERVAL 30 DAY) THEN 1 ELSE 0 END", :type => :integer, :as => :live
    ...
    # delta:
    ...
end

Тогда в вашем контроллере, все, что вам нужно сделать, это проверить, если: live => 1, чтобы получить все записи, которые имеют start_dates и end_dates в диапазонах дат.

Я использовал sphinx_scope так:

sphinx_scope(:live) {
    { :with => { :live => 1 } }
}

, а затем в мой контроллер:

@models = Model.live.search(...)

Чтобы убедиться, что он работает хорошо, вы, конечно, нужно осуществлять частые переиндексацию чтобы убедиться, что индекс обновлен, т.е. правильные записи: live => 1 или 0!

Во всяком случае, это, вероятно, для вас немного поздно, но я реализовал его, и он работает как шарм !!!

8

позволяет говорить d = "2010-12-10"

:post_date => (d.to_time.to_i..Time.now.to_i) получил бы вас там. Я только что сделал это в моем проекте, и он прекрасно работает

-1

Не будет ли это работать, если вы заменили

d = DateTime.strptime(params[:since], '%Y-%m-%d') 

по

Time.parse(params[:since]).strftime("%Y-%m-%d") 

(Кажется, первый один не возвращает дату в ожидаемом формате)

Смежные вопросы