Думающий Сфинкс с диапазоном дат - PullRequest
7 голосов
/ 01 июня 2010

Я реализую API полнотекстового поиска для своих приложений на rails, и до сих пор добивался большого успеха с Thinking 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 передавался с даты «с», чтобы увидеть все сообщения после определенной даты. Я указываю, что дата должна быть в формате ГГГГ-ММ-ДД.

Спасибо за вашу помощь. Chris

РЕДАКТИРОВАТЬ: Я только что изменил оператор слияния параметров даты на этот

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 09 декабря 2010

скажем, d = "2010-12-10"

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

2 голосов
/ 28 сентября 2010

Я наконец-то решил это, но он использует немного другой подход, но работает нормально.

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

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

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

define index do<br/> # fields:<br/> ...<br/> # attributes:<br/> 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<br/> ...<br/> # delta:<br/> ...<br/> end

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

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

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

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

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

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

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

0 голосов
/ 09 декабря 2010

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

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

по

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

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

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