连接器同步规则
编辑连接器同步规则
编辑使用连接器同步规则来帮助控制哪些文档在第三方数据源和 Elasticsearch 之间同步。在每个连接器索引的 Kibana UI 中定义同步规则,位于索引的同步规则
选项卡下。
可用性和先决条件
编辑在 Elastic 版本8.8.0 及更高版本中,所有连接器都支持基本同步规则。
某些连接器支持高级同步规则。在各个连接器的参考文档中了解更多信息。
同步规则的类型
编辑同步规则有两种类型
- 基本同步规则 - 这些规则以表格形式呈现。基本同步规则对于所有连接器都是相同的。
- 高级同步规则 - 这些规则涵盖了无法用基本同步规则表达的复杂查询和过滤场景。高级同步规则通过特定于源的 DSL JSON 代码片段定义。
通用数据过滤概念
编辑在讨论同步规则之前,了解数据过滤概念的基础知识非常重要。下图显示了数据过滤可能发生在几个不同的流程/位置。
在本指南中,我们将重点关注远程和集成过滤。同步规则可用于修改这两者。
远程过滤
编辑数据可能在其源处被过滤。我们称之为远程过滤,因为过滤过程在 Elastic 外部。
集成过滤
编辑集成过滤充当原始数据源和 Elasticsearch 之间的桥梁。连接器中发生的过滤就是集成过滤的一个示例。
管道过滤
编辑最后,Elasticsearch 可以使用摄取管道在持久化之前过滤数据。在本指南中,我们不会关注摄取管道过滤。
目前,基本同步规则是控制连接器集成过滤的唯一方法。请记住,远程过滤的范围远远超出了连接器本身。为了获得最佳效果,请与数据源的所有者和维护者合作。确保源数据组织良好并针对连接器发出的查询类型进行了优化。
同步规则概述
编辑在大多数情况下,您的数据湖将包含比您希望向最终用户公开的更多数据。例如,您可能希望搜索产品目录,但不希望包含供应商联系信息,即使出于业务目的,这两个信息位于同一位置。
过滤数据的最佳时间是在数据管道早期。主要有两个原因
- 性能:向后端数据源发送查询比获取所有数据然后在连接器中过滤它更有效。发送较小的数据集通过网络并处理连接器侧的速度更快。
- 安全性:查询时过滤应用于数据源侧,因此数据不会通过网络发送到连接器,从而限制了数据暴露。
在理想情况下,所有过滤都将作为远程过滤完成。
然而,在实践中,这并非总是可行。某些源不允许强大的远程过滤。其他源允许,但需要特殊的设置(在特定字段上构建索引、调整设置等),这可能需要您组织中的其他利益相关者关注。
考虑到这一点,同步规则旨在修改远程过滤和集成过滤。您的目标应该是尽可能多地进行远程过滤,但集成是一个完全可行的备选方案。根据定义,远程过滤是在从第三方源获取数据之前应用的。集成过滤是在从第三方源获取数据后,但在将其摄取到 Elasticsearch 索引之前应用的。
所有同步规则都应用于给定文档之前对该文档运行任何摄取管道。因此,您可以将摄取管道用于必须在集成过滤发生之后发生的任何处理。
如果添加、编辑或删除了同步规则,则只有在下一次完全同步后才会生效。
基本同步规则
编辑每个基本同步规则可以是两种“策略”之一:include
和exclude
。Include
规则用于包含“匹配”指定条件的文档。Exclude
规则用于排除“匹配”指定条件的文档。
“匹配”是根据由“字段”、“规则”和“值”组合定义的条件确定的。
字段
列应用于定义应考虑给定文档上的哪个字段。
规则
列中提供以下规则
-
equals
- 字段值等于指定值。 -
starts_with
- 字段值以指定(字符串)值开头。 -
ends_with
- 字段值以指定(字符串)值结尾。 -
contains
- 字段值包含指定(字符串)值。 -
regex
- 字段值匹配指定的正则表达式。 -
>
- 字段值大于指定值。 -
<
- 字段值小于指定值。
最后,值
列取决于
- 指定“字段”中的数据类型
- 选择了哪个“规则”。
例如,如果[A-Z]{2}
的值可能对regex
规则有意义,但对>
规则意义不大。同样,当对ip_address
字段进行操作时,您可能不会有espresso
的值,但对于beverage
字段,您可能会拥有。
基本同步规则示例
编辑示例 1
编辑排除所有ID
字段的值大于 1000 的文档。
示例 2
编辑排除所有state
字段匹配指定正则表达式的文档。
性能影响
编辑- 如果您仅依赖集成过滤阶段中的基本同步规则,连接器将从数据源获取所有数据
- 对于没有自动分页或类似优化的数据源,获取所有数据可能导致内存问题。例如,加载数据集太大而无法一次装入内存。
Elastic 提供的原生 MongoDB 连接器使用分页,因此具有优化的性能。请记住,自定义社区构建的自托管连接器可能没有这些性能优化。
下图说明了分页的概念。庞大的数据集可能无法容纳到连接器实例的内存中。将数据拆分为较小的块可以降低内存不足错误的风险。
此图说明了整个数据集一次性提取
相比之下,此图说明了分页数据集
高级同步规则
编辑高级同步规则会覆盖可能从基本同步规则推断出的任何远程过滤查询。如果定义了高级同步规则,则任何定义的基本同步规则将专门用于集成过滤。
高级同步规则仅用于远程过滤。您可以将高级同步规则视为表示数据源查询的与语言无关的方式。因此,这些规则高度特定于源。
以下连接器支持高级同步规则
每个支持高级同步规则的连接器都提供自己的 DSL 来指定规则。有关详细信息,请参阅每个连接器的文档。
组合基本和高级同步规则
编辑您还可以将基本同步规则和高级同步规则一起使用来过滤数据集。
下图概述了高级同步规则、基本同步规则和管道过滤应用于文档的顺序
示例
编辑在以下示例中,我们希望过滤包含公寓的数据集,使其仅包含具有特定属性的公寓。我们将在整个示例中使用基本和高级同步规则。
在.json
格式中,示例公寓如下所示
{ "id": 1234, "bedrooms": 3, "price": 1500, "address": { "street": "Street 123", "government_area": "Area", "country_information": { "country_code": "PT", "country": "Portugal" } } }
目标数据集应满足以下条件
- 每个公寓至少应有3 个卧室
- 公寓每月租金不应超过1500 美元
- 带有id为1234的公寓应在不考虑前两个条件的情况下包含在内。
- 每个公寓都应位于葡萄牙或西班牙。
前3个条件可以通过基本同步规则处理,但第4个条件我们需要使用高级同步规则。
基本同步规则示例
编辑要创建新的基本同步规则,请导航到“同步规则”选项卡并选择创建新的同步规则草稿
之后,您需要按下“保存并验证草稿”按钮来验证这些规则。请注意,保存后规则将处于草稿状态。除非它们被应用,否则它们不会在下次同步中执行。
成功验证后,您可以应用规则,以便它们在下次同步中执行。
以下条件可以通过基本同步规则覆盖
- 带有id为1234的公寓应在不考虑前两个条件的情况下包含在内。
- 每个公寓至少应有三间卧室。
- 公寓的月租金不应超过1000元。
请记住,基本同步规则的顺序很重要。对于不同的排序,您可能会得到不同的结果。
高级同步规则示例
编辑您只想包含位于葡萄牙或西班牙的公寓。我们需要在这里使用高级同步规则,因为我们正在处理嵌套深度很高的对象。
假设公寓数据存储在MongoDB实例中。对于MongoDB,我们支持在高级同步规则中使用聚合管道等功能。仅选择位于葡萄牙或西班牙的属性的聚合管道如下所示
[ { "$match": { "$or": [ { "address.country_information.country": "Portugal" }, { "address.country_information.country": "Spain" } ] } } ]
要创建这些高级同步规则,请导航到同步规则创建对话框并选择“高级规则”选项卡。您现在可以将聚合管道粘贴到aggregate.pipeline
下的输入字段中。
验证后,应用这些规则。以下屏幕截图显示了已应用的同步规则,这些规则将在下次同步中执行
同步成功后,您可以展开同步详细信息以查看应用了哪些规则。
当在 UI 外部更改时,活动同步规则可能会失效。包含无效规则的同步作业将失败。一种解决方法是重新验证草稿规则并覆盖无效的活动规则。