0

更新:重新定义了我想要做的事情。

我有一个联系人模型,此联系人与我帐户中的所有其他模型一样属于一个帐户。我需要所有搜索,无论它们是全局的还是特定于模型的,只查询包含的帐户。有人告诉我,我可以使用自定义索引名称来做到这一点。我希望索引名称为“index-#{account-id}”。我将如何在我的活动模型中实现这一点?

class Contact < ActiveRecord::Base
  include Tire::Model::Search
  include Tire::Model::Callbacks

  belongs_to :account

  mapping do
    indexes :first_name
    indexed :last_name
  end    

end

class Account < ActiveRecord::Base
    has_many :contacts
end
4

2 回答 2

1

您可能想在 Tyre 的问题上查看此评论,该评论基本上介绍了使用 Tire 命名的“基于租户”索引命名的一些可能场景。我相信这就是你所追求的。

在 elasticsearch 本身中,您可以选择为每个帐户设置一个单独的索引、为每个帐户设置一个过滤和路由的索引别名、索引模板等,因此该工具包在该领域非常庞大。

于 2012-08-06T17:18:34.190 回答
0

您是指让每个帐户(用户?)在每个它自己的索引中物理上分开吗?这通常被称为“多租户” http://en.wikipedia.org/wiki/Multitenancy

假设这确实是您打算做的事情:

过去有很多关于“需要”的说法(我假设您出于安全原因想要这个,我不熟悉您想要这个的其他原因,尽管我不是多租户应用程序的专家)用于分区每个帐户/用户的数据,而不是仅具有一个字段accountidContact并确保您的所有查询至少在accountid. IMO,一个精心设计的查询组件,例如,系统中使用的每个查询都继承自一个需要设置的“超级查询”,accountid在很多情况下就足够了。

即使您事先不知道将来哪些应用程序想要查询这些索引,您仍然可以通过说围绕 ES 拥有一个瘦 REST 服务并要求所有程序通过该服务与 ES 交互来强制执行上述操作。然后,您可以让此服务通过强制执行accountid或可能更好地通过accountid执行请求的当前登录用户推断 来处理这种类型的安全性。

如果您仍想追求多租户,请查看:http : //elasticsearch-users.115913.n3.nabble.com/Multi-tenacy-td471400.html(快速搜索此,也许周围有更好的东西)'Kimchy '(ES 的创建者)也在该线程中发表评论。

无论如何,在 ES 中拥有多租户的最佳方式可能是每个 account/user 有 1 个索引。在其中你可以有多个“类型”(一个 ES 构造),其中Contact可能是这样的类型。

http://www.elasticsearch.org/guide/reference/mapping/ http://www.elasticsearch.org/guide/reference/api/search/indices-types.html

正如您所建议的那样,在您的模型中执行此操作可能不是 IMO 的正确方法。一般来说,你应该让你的领域模型远离存储后端的任何知识(包括存储数据的索引)

对我来说,更好的解决方案是,如前所述,拥有一个查询组件,其中包含基于帐户/用户选择正确索引的逻辑。使用上面的 rest-service 方法,动态索引名,正如您所建议的,可以从执行请求的登录用户中获得。

我意识到这可能不是您问题的直接答案,但我希望它仍然有用。

于 2012-06-27T09:29:30.243 回答