ElasticSearch + Tire: OR запрос - PullRequest
       21

ElasticSearch + Tire: OR запрос

1 голос
/ 19 марта 2012

У меня проблемы с определением запроса с помощью Tire.

Что у меня есть:

Мои документы - события.У них есть дата starts_at и дата ends_at.Дата ends_at не требуется.

Что я хочу:

Я хочу отобразить предстоящие события (например).Я бы определил upcoming следующим образом:

  • ends_at дата присутствует И после Time.now

ИЛИ

  • ends_at дата не указана, И starts_at после Time.now

Сейчас я просто делаю

query do
    boolean do
        must { range :starts_at, { gte: bod } }
    end
end

Как я могу выполнить этот запрос ИЛИ?

1 Ответ

3 голосов
/ 20 марта 2012

единственный способ, о котором я могу думать сейчас, - это использовать _missing_ и _exists_ в строковом запросе:

require 'tire'
require 'active_support/core_ext/numeric/time'
require 'active_support/core_ext/date/calculations'
require 'active_support/duration'

Time::DATE_FORMATS.update :lucene => "%Y-%m-%dT%H:%M:%S%z"

Tire.index('events_stackoverflow_demo').delete

class Event
  include Tire::Model::Persistence

  property :title
  property :starts_at, type: 'date'
  property :ends_at,   type: 'date'

  index_name 'events_stackoverflow_demo'
end

Event.create id: 1, title: 'Test 1', starts_at: 2.days.ago, ends_at: 1.days.ago
Event.create id: 2, title: 'Test 2', starts_at: 1.day.ago,  ends_at: 1.day.since
Event.create id: 3, title: 'Test 3', starts_at: 1.day.since

Event.tire.index.refresh

upcoming = Event.search do
  query do
    boolean minimum_number_should_match: 1 do
      should { string "_exists_:ends_at AND ends_at:[#{Time.now.to_s(:lucene)} TO *]"  }
      should { string "_missing_:ends_at AND starts_at:[#{Time.now.to_s(:lucene)} TO *]"  }
    end
  end

  p to_curl

end.results

puts "---"

p upcoming
...