我需要任何可能拥有ElasticSearch如何工作和API的经验/知识的人的一些意见。 我有一个(非常大的)数据库,其中包含大量不同项目的数据。
我需要通过公共API搜索所有这些数据,以便任何人都可以使用它并查询有关特定项目数据的API。我已经有了ElasticSearch up&运行,并在ElasticSearch中使用数据库中的所有数据填充索引。 ElasticSearch工作正常,API也是如此。
我现在面临的挑战是我们数据库中的一些数据是"私有"数据不得公开搜索。同时,这些私有数据必须在内部可搜索,这意味着我需要在公共模式和私有模式(用户通过身份验证)中运行API。当未经过身份验证的客户端向API查询某些数据时,客户端应仅获取公共项,而私有(用户身份验证)客户端应获得所有可能的结果。 我不会遇到项目的问题,因为一个项目的所有数据都不能公开。我可以简单地用标记标记它们,并确保当我通过API将数据返回给客户端时,它们不会被ElasticSearch返回。
如果某个项目的数据是私有的,而部分数据是公开的,则会出现挑战。我曾想过在将数据返回给(公共)客户端之前剥离私有数据。这样私有数据不能直接通过API获得,但它将间接/隐式地提供。例如,如果客户搜索了一些属于私人性质的数据,那么我将会"剥离"在将其返回给用户之前来自搜索结果的私有数据,然后客户端将获得返回的文档,指示该文档是"命中"对于特定的查询。但是,在我返回的文档中找不到客户端的特定查询字符串,因此表明查询字符串以某种方式与文档关联,并且该关联具有敏感/私有性质。
我考虑过创建两个不同的索引。一个包含所有对象(私有索引)的所有数据,另一个只包含公开数据的数据(我已经剥离了敏感数据部分的所有文档)。这可行,并且是一个相当容易实现的解决方案,但缺点是我现在在两个索引中有重复的数据。
有什么想法吗?
答案 0 :(得分:1)
根据您的说明,您显然需要两个不同的视图数据:
PUBLIC :集合中文档的子集,不应搜索或返回某些字段。
PRIVATE :整个集合,所有字段均可搜索且可见。
您可以通过以下方式完成两个不同的视图数据
在第一种情况下,您提到的公共查询将过滤掉私人文档,并且只搜索/返回公开可见的字段。私有查询将不过滤,并将搜索/返回所有字段。
在第二种情况下,您实际上将数据索引到两个单独的索引,并明确地对公共索引运行公共查询 >(仅包含公共字段),私人查询针对私人索引运行。
确实 可以 构建一个机制(或使用Shield)来在单个索引之上完成所需的操作。但是,如果出现以下情况,您可能需要考虑(2)公共/私人指数选项:
作为最后一点的一个例子,大多数免费增值网站的支付与非付费用户的分布非常偏离(为了争论,比如十分之一)。
您不仅可能需要积极地 复制 您的公共索引,还需要剥离私有字段的公共文档, 您将按比例减少所需的资源来管理您的公共分片(和副本)。
这提出了数据复制的问题。在大多数系统中,搜索索引不是“记录系统”(参见discussion)。搜索索引更常用于外部数据库索引,或者可能是物化视图。当存在代表最新状态的持久后备存储时,在此方案中具有重复数据不是问题。
如果由于某种原因,你依赖Elasticsearch作为“记录系统”,那么双索引路线有点棘手(因为你需要选择一个,可能是私有索引表示基本事实,然后将另一个(公共索引)视为私人数据的下游 视图 。)