2013-01-14 24 views
5

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.

  1. 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.
  2. 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.

Trả lời

0

Lập chỉ mục là cách phù hợp để thực hiện việc này. Cùng với việc lập chỉ mục tên trường, bạn có thể lập chỉ mục kết quả của các phương thức.

mapping do 
    indexes :payload_details, :as => 'payload_details', :analyzer => 'snowball',:boost => 0 
end 

def payload_details 
    "#{payload.fname} #{payload.lname}" #etc. 
end 

Giá trị được lập chỉ mục trở thành loại vịt, vì vậy nếu bạn lập chỉ mục tất cả giá trị mà bạn tham chiếu trong chế độ xem, dữ liệu sẽ có sẵn. Nếu bạn truy cập vào thuộc tính không được lập chỉ mục trên mô hình của mục được lập chỉ mục, nó sẽ lấy cá thể từ ActiveRecord, nếu bạn truy cập thuộc tính của mô hình liên quan, tôi chắc chắn bạn sẽ gặp lỗi tham chiếu, nhưng công cụ tìm động tiếp nhận.

Các vấn đề liên quan