2012-05-03 26 views
5

Tôi có một số mô hình được lập chỉ mục với elasticsearch và một trong số họ có một hiệp hội mà cần phải được lọc, nhưng nếu tôi thêm một cái gì đó như thế này vào search phương phápLọc áp dụng để chỉ có một mô hình với lốp và ElasticSearch trong Rails

search.filter :range, 'sessions.starts_on' => {:gte => start_date, 
               :lte => ends_on} 

thì tất cả các mô hình được lọc ra vì chúng không có liên kết như vậy sessions.

Vậy có cách nào để áp dụng bộ lọc cho chỉ một mô hình không?

Bất kỳ suy nghĩ nào được đánh giá cao!

+0

bạn đang sử dụng AciveRecord? và bạn đã cân nhắc việc tùy chỉnh phương thức chỉ mục to_json cho điều này chưa? – abhas

+0

có cho ActiveRecord. Và tùy chỉnh chỉ mục - chính xác như thế nào? để có những 'sessions.starts_on' này trở về cái gì? – alony

Trả lời

1

Tạo mô-đun cho chỉ số lốp đặc biệt liên quan đến mô hình đó và đưa nó vào mô hình. Vì các phiên chỉ liên kết với mô hình, tham chiếu của nó sẽ có trong tài liệu mà sẽ là elasticsearch. Bạn cần phải hợp nhất các tài liệu phiên trong tài liệu mô hình của bạn như thế này như chúng tôi đã thông qua json của tài liệu để elasticsearch trong mô-đun chỉ số lốp

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

phương pháp này được thông qua một tài liệu json để elasticsearch qua lốp mà sẽ tổ chức của họ phiên được hợp nhất trong tài liệu.

trong mô-đun chỉ số lốp cho một tên chỉ số mà bạn có thể vượt qua trong các đối tượng tìm kiếm lốp để chạy các bộ lọc truy vấn

Bây giờ, tạo một đối tượng tìm kiếm lốp

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

bạn có thể kiểm tra các thuộc tính khác mà bạn có thể vượt qua từ https://github.com/karmi/tire

sau đó chạy phương pháp tìm kiếm của bạn như thế này nó sẽ cho kết quả mong muốn

search_object.filter :range, 'sessions.starts_on' => {:gte => start_date, 
                :lte => ends_on} 
Các vấn đề liên quan