【发布时间】:2018-06-06 00:19:16
【问题描述】:
我需要任何可能对 ElasticSearch 的工作原理和 API 有经验/知识的人提供一些意见。 我有一个(非常大的)数据库,其中包含许多不同项目的大量数据。
我需要通过公共 API 使所有这些数据可搜索,以便任何人都可以使用它并查询 API 以获取特定项目的数据。我已经启动并运行了 ElasticSearch,并在 ElasticSearch 中填充了数据库中的所有数据的索引。 ElasticSearch 运行良好,API 也运行良好。
我现在面临的挑战是,我们数据库中的某些数据是“私人”数据,不得公开搜索。同时,这些私有数据必须在内部是可搜索的,这意味着我需要让 API 在公共模式和私有模式(用户认证)下运行。当未通过身份验证的客户端向 API 查询某些数据时,客户端应仅获取公共项目,而私有(用户身份验证)客户端应获取所有可能的结果。 我对一个项目的所有数据不得公开的项目没有任何问题。我可以简单地用一个标志标记它们,并确保当我通过 API 向客户端返回数据时,ElasticSearch 不会返回它们。
当某项数据的一部分是私有数据而部分数据是公开的时,就会出现挑战。在将数据返回给(公共)客户端之前,我考虑过剥离私有数据。这样,私有数据不能直接通过 API 获得,而是间接/隐式地获得。例如,如果客户端搜索了一些具有私有性质的数据,在这种情况下,我将在将其返回给用户之前从搜索结果中“剥离”私有数据,那么客户端将获得返回的文档,表明该文档是特定查询的“命中”。但是,在我返回的文档中找不到来自客户端的特定查询字符串,因此表明查询字符串以某种方式与文档相关联,并且该关联具有敏感/私有性质。
我考虑过创建两个不同的索引。一个包含所有对象的所有数据(私有索引),一个只包含公开可用数据(我已经剥离了敏感数据部分的所有文档)。这将是可行的,并且是一个相当容易实施的解决方案,但缺点是我现在在两个索引中复制了数据。
有什么想法吗?
【问题讨论】:
-
另一种方法是利用 Shield 的 field and document-level security
-
谢谢!不知道 Elastic 有这种功能。
标签: api elasticsearch