企业创建一个以实体为中心的索引,其中仅包含每个实体的最新文档,在许多情况 下都十分有用。比如,您可能正在管理一个电商网站,并且想要跟踪每个客户的最 新订单。或者,您可能想针对某段时间内不活跃的客户开展营销活动。有什么方法 能最快和最有效地编译并组织此类数据呢?
Elasticsearch的Transforms功能将帮助您基于事件索引和转换函数创建并维护 以实体为中心的索引。不久之前,pivot还是唯一可用的功能,它是一个连续的 group-by plus聚合。在712版中,我们又添加了一个转换函数,称为latest。它将 源索引转换为目标索引,以便目标索引中仅包含每个实体的一个最新文档。在这篇 博文中,我们将介绍如何通过transform (转换)功能加以实现上述优化。
1. 性能注意事项
在transforms中引入latest之前,您可以通过使用pivot和scripted_metric聚合 来实现类似的效果。但是,基于脚本的解决方案存在许多问题:
1)它需要用Painless编写代码,这使得:
• 较为基础的用户难以进行创建和维护;
•容易出错(参考Painless代码中容易出现的所有意外错误)。
2)它在集群中占用了更多的资源;
3)它性能低缓。
性能低缓的原因显而易见,对于每个检查点,transform都需要执行源索引的完整 扫描,以便为每个实体找到最新的文档。由于脚本对transform来说是个黑盒,它 不知道要将搜索限制为"仅最近的文档"。这使得计算成本随着时间的推移不断攀 升,并给集群带来不必要的压力。
为了规避这一问题,latest函数应运而生,经过优化,latest transform功能不需要搜索整个源索引。它知道最新的文档必须处在当前检查点中,否则就没有必要更新目标索引。
2. 准备数据集
在本文中,我们将使用Kibana的"Sample eCommerce orders"(电商订单)样本数据集做演示。
如果您想继续学习,最简单的方法是在Elastic Cloud中开始免费试用。
进入Kibana后,您可以单击"Add data” (添加数据)按钮从"Sample data” (样本数据)目录中获取数据集。
此后,我们将创建kibana_sample_data_ecommerce索引。索引中的每个文档都 是某个客户(由order_id字段标识)下达的订单(由名为order_id的字段标识)。
我们会将kibana_sample_data_ecommerce索引转换为一个新索引(我们将其称为latest_order_per_customer),其中仅包含每个客户的最新订单。
3. 设置目标索引模版
首先,我们需要有一个索引模版,用于目标索引。
执行此步骤的基本原理是:与pivot不同,latest不会自动推断目标索引映射。因 此,如果没有预先存在的目标索引(或索引模板),动态索引映射将被启用,这一结 果可能不会是您想要的。
想要实现目标索引的映射与源索引的映射匹配,我们就需要执行以下操作:
1)在 Stack Management (堆栈管理)〉Index Management (索引管理)页面中 确定源索引的映射,并将完整的映射JSON复制到剪贴板。
2)在"Create Template”(创建模板)页面中创建一个新的索引模板,并将其模 式设置为"latest_order*”,以匹配您稍后将在transform配置中指定的目标 索引名称。
3)使用"Load JSON"(加载JSON)选项填充映射部分并粘贴剪贴板中的映射。
4)删除"mappings"和"_doc”嵌套级别,使JSON看起来如上述屏幕截图。应 用这些正确的映射后,目标索引已准备好由transform进行填充。
4. 设置 transform 功能
现在我们准备创建一个transform,它能为每个客户维护最新的订单。
1)转到 S tack Management (堆栈管理)>Transforms (转换),然后在 Create
Transform (创建转换)页面上选择Latest (最新)按钮。
2)在屏幕下面的transform配置中,将“Unique keys”(唯一密钥)选项配置
为customer_id的值并将“Sort字段(排序字段)”设置为crder_date。
将transform设置为连续运行很重要。连续转换不会在处理历史数据后立即停止, 而是继续处理实时接收的任何新数据:
确保您在模板中指定的索引模式匹配的目标索引名称。
此外,启用“Creat Kibana index pattern"(创建Kibana索引模式)选项。
3)最后,让我们点击“Create and start"(创建并开始)按钮来启动我们刚刚
配置的 transform。
正在运行的transform 现在将处理kibana_sample_data_ecommerce索引并使用 每个客户的最新订单不断更新目标索引latest_order_per_customer。如果有更多的 订单到达,transform将相应地更新目标索引。
5. 设置保留策略
如上所述,latest transform将使用每个客户的最新订单不断更新目标索引。但是, 如果客户不继续在我们的电商网站上购物怎么办?
此客户的信息将保留在目标索引中,但不会再收到任何更新。如果您希望清除旧的 信息,请为transform中的目标索引设置保留策略。
1)转到transform的"Edit” (编辑)页面,在字段中输入order_date并将Max age (最大日期)设置为30d设置。
2)单击“Update” (更新)按钮以应用新策略。
根据此保留政策,任何在过去30天内未下订单的客户都将从目标索引中删除。
值得一提的是,上述保留措施(「etention_po[icy)也可以通过pivot来实现,而不 仅仅是latest!
6. 结论
总而言之,我们利用了最新的transforms选项(latest函数)来跟踪数据,集中每
个客户的最新订单。我们还制定了合理的保留策略,以自动清理和删除在特定时间 范围内不再购买商品的客户。
latest还有许多其他可能的使用场景,包括:
• 识别和激活在规定时间内没有订购任何东西的客户;
• 维护数据中心每台机器的最新运行状态;
• 维护每个空气污染传感器(站)的当前空气污染测量结果。