我正在使用 Rails 3 应用程序,以允许人们申请赠款等。我们使用 Elasticsearch/Tire 作为搜索引擎。
文件,例如拨款提案,由许多不同类型的答案组成,例如联系信息或论文。在 AR 中,(通常是关系数据库)您不能直接指定多态“has_many”关系,因此:
class Document < ActiveRecord::Base
has_many :answerings
end
class Answering < ActiveRecord::Base
belongs_to :document
belongs_to :question
belongs_to :payload, :polymorphic => true
end
“有效负载”是个人答案类型的模型:联系人、叙述、多项选择等。(这些模型在“Answerable”下命名。)
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
从概念上讲,这个想法是一个答案由一个答案(类似于连接表的功能,存储所有答案共有的元数据)和一个可回答(存储答案的实际内容)组成。这非常适合编写数据。搜索和检索,不是那么多。
我想使用 Tire/ES 来展示我的数据的更健全的表示形式,以进行搜索和阅读。在正常的轮胎设置中,我最终会得到 (a) 一个用于回答的索引和 (b) 用于叙述、联系人、多项选择等的单独索引。相反,我只想存储文档和答案,可能作为父/子。Answers 索引将合并来自 Answerings(id、question_id、updated_at...)和 Answerables(fname、lname、email...)的数据。这样,我可以从单个索引中搜索 Answers,按类型、question_id、document_id 等进行过滤。更新将由 Answering 触发,但每个回答都会从其可回答内容中提取信息。我正在使用 RABL 模板化我的搜索引擎输入,所以这很容易。
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: root@me.com, narrative_content: "Back in the day, when I was a teenager, before I had...", answerable_type: "narrative" }
所以,我有几个问题。
- 目标是为所有答案提供单一查询解决方案,无论底层(可回答)类型如何。我以前从来没有设置过这样的东西。这似乎是解决问题的明智方法吗?你能预见我无法预见的皱纹吗?替代方案/建议/等。受欢迎的。
在我看来,棘手的部分是映射。我的计划是为需要索引选项的字段在 Answering 模型中放置显式映射,并让默认映射处理其余部分:
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 [...]
如果我没有为某些字段指定映射(例如“fname”),Tire/ES 会退回到动态映射吗?(我应该明确映射将要使用的每个字段吗?)
提前致谢。请让我知道我是否可以更具体。