Tôi đang làm việc với ứng dụng Rails 3 để cho phép mọi người nộp đơn xin trợ cấp và như vậy. Chúng tôi đang sử dụng Elasticsearch/Tyre làm công cụ tìm kiếm.Làm phẳng mối quan hệ AR đa hình với Elasticsearch/Tire
Tài liệu, ví dụ: đề xuất cấp, bao gồm nhiều câu trả lời về các loại khác nhau, như thông tin liên hệ hoặc bài tiểu luận. Trong AR, (dbs quan hệ nói chung), bạn có thể chỉ định một đa hình "has_many" mối quan hệ trực tiếp, vì vậy thay vì:
class Document < ActiveRecord::Base
has_many :answerings
end
class Answering < ActiveRecord::Base
belongs_to :document
belongs_to :question
belongs_to :payload, :polymorphic => true
end
"Sức tải" là mô hình với nhiều loại cá nhân trả lời: danh bạ, tường thuật, nhiều lựa chọn, và Sớm. (Những mô hình này namespaced dưới "có thể trả lời.")
class Answerable::Narrative < ActiveRecord::Base
has_one :answering, :as => :payload
validates_presence_of :narrative_content
end
class Answerable::Contact < ActiveRecord::Base
has_one :answering, :as => :payload
validates_presence_of :fname, :lname, :city, :state, :zip...
end
Về mặt lý thuyết, ý tưởng là một câu trả lời bao gồm một trả lời (các chức năng như một bảng tham gia, các cửa hàng siêu dữ liệu chung cho tất cả những câu trả lời) và có thể trả lời (lưu trữ nội dung thực tế của câu trả lời.) Công cụ này rất hữu ích cho việc ghi dữ liệu. Tìm kiếm và truy xuất, không quá nhiều.
Tôi muốn sử dụng Lốp/ES để hiển thị biểu diễn dữ liệu của tôi sane hơn để tìm kiếm và đọc. Trong một thiết lập lốp bình thường, tôi sẽ kết thúc với (a) một chỉ mục cho câu trả lời và (b) các chỉ mục riêng biệt cho tường thuật, liên hệ, nhiều lựa chọn, v.v. Thay vào đó, tôi muốn lưu trữ Documents and Answers, có thể là cha/con. Chỉ mục Câu trả lời sẽ hợp nhất dữ liệu từ Trả lời (id, question_id, updated_at ...) và Answerables (fname, lname, email ...). Bằng cách này, tôi có thể tìm kiếm câu trả lời từ một chỉ mục duy nhất, lọc theo loại, question_id, document_id, v.v. Các cập nhật sẽ được kích hoạt từ Trả lời, nhưng mỗi câu trả lời sau đó sẽ lấy thông tin từ câu trả lời của nó. Tôi đang sử dụng RABL để tạo mẫu cho các đầu vào của công cụ tìm kiếm của tôi, vì vậy điều đó dễ dàng.
Answering.find(123).to_indexed_json # let's say it's a narrative
=> { id: 123, question_id: 10, :document_id: 24, updated_at: ..., updated_by: [email protected], narrative_content: "Back in the day, when I was a teenager, before I had...", answerable_type: "narrative" }
Vì vậy, tôi có một vài câu hỏi.
- Mục tiêu là cung cấp giải pháp truy vấn đơn cho tất cả các câu trả lời, bất kể loại cơ bản (có thể trả lời). Tôi đã không bao giờ thiết lập một cái gì đó như thế này trước. Điều này có vẻ giống như một cách tiếp cận lành mạnh cho vấn đề này? Bạn có thể thấy trước các nếp nhăn tôi không thể? Giải pháp thay thế/đề xuất/v.v. được hoan nghênh.
Phần khó hiểu, như tôi thấy, là ánh xạ. Kế hoạch của tôi là đưa ánh xạ rõ ràng trong mô hình Answering cho các lĩnh vực mà cần lựa chọn lập chỉ mục, và chỉ cho phép các ánh xạ mặc định chăm sóc phần còn lại:
mapping do indexes :question_id, :index => :not_analyzed indexes :document_id, :index => :not_analyzed indexes :narrative_content, :analyzer => :snowball indexes :junk_collection_total, :index => :not_analyzed indexes :some_other_crazy_field, :index [...]
Nếu tôi không chỉ định một ánh xạ đối với một số lĩnh vực, (nói, "fname") sẽ Tire/ES rơi vào bản đồ năng động? (Tôi có nên ánh xạ rõ ràng mọi trường sẽ được sử dụng không?)
Cảm ơn trước. Vui lòng cho tôi biết nếu tôi có thể cụ thể hơn.