2012-05-03 9 views
5

Ben elasticsearch ile endeksli ve bunlardan biri süzülür gereken bir ilişki vardır, ama birkaç model Ben search yöntemleFiltre Rails Tire ve ElasticSearch ile tek modele uygulamak

search.filter :range, 'sessions.starts_on' => {:gte => start_date, 
               :lte => ends_on} 
içine böyle bir şey eklerseniz

daha sonra, tüm modeller filtrelenir çünkü bunlar sessions gibi bir ilişkilendirmeye sahip değildir.

Sadece bir modele filtre uygulamanın bir yolu var mı?

Herhangi bir düşünce çok takdir edilir!

+0

AciveRecord'u kullanıyor musunuz? ve bunun için to_json indeks metodunu özelleştirmeyi düşündünüz mü? ActiveRecord için – abhas

+0

evet. Ve endeks özelleştiriliyor - tam olarak nasıl? bu 'sessions.starts_on' neyi geri döndürmek için? – alony

cevap

1

Özel olarak bu modelle ilişkili olan lastik dizini için bir modül oluşturun ve modele dahil edin. Oturumlar yalnızca modelle ilişkilendiğinden, referans, elasticsearch'e giden belgede olacaktır. Biz lastik endeksi modülünde elasticsearch belgenin json geçerken Böyle modeliniz belgesinde oturumları belgesi birleştirmek zorunda

def to_model_json 
    self.document.merge({"sessions" => sessions.as_json}).to_json 
end 

bu yöntem sahip olacak lastiğin içinden elasticsearch için json bir belge geçiyor onların oturumlar belgede birleştirildi. Filtreyi çalıştırmak için lastik arama nesnesi iletebilirsiniz bir indeks isim vermek lastik endeksi modülünde

Şimdi diğer özelliklerini kontrol edebilirsiniz bir lastik arama nesnesi

search_object = Tire::Search::Search::new(Model.index_name, other attributes) 

oluşturmak sorgular hangi sizi o zaman bu gibi arama yöntemi çalıştırmak https://github.com/karmi/tire

dan geçebilir istenilen bir sonuç

search_object.filter :range, 'sessions.starts_on' => {:gte => start_date, 
                :lte => ends_on} 
0 verecektir
İlgili konular