您是指让每个帐户(用户?)在每个它自己的索引中物理上分开吗?这通常被称为“多租户” http://en.wikipedia.org/wiki/Multitenancy
假设这确实是您打算做的事情:
过去有很多关于“需要”的说法(我假设您出于安全原因想要这个,我不熟悉您想要这个的其他原因,尽管我不是多租户应用程序的专家)用于分区每个帐户/用户的数据,而不是仅具有一个字段accountid
,Contact
并确保您的所有查询至少在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 方法,动态索引名,正如您所建议的,可以从执行请求的登录用户中获得。
我意识到这可能不是您问题的直接答案,但我希望它仍然有用。