何时使用Transforms
Elastic Stack Serverless
Elasticsearch 聚合 (aggregations) 是一个强大而灵活的特性,它使你能够对数据进行汇总并检索复杂的见解。你可以汇总复杂的信息,例如繁忙网站上每天的 Web 请求数量,并按地理位置和浏览器类型进行细分。然而,如果你使用相同的数据集尝试计算一个简单的数字,例如访客 Web 会话的平均时长,则很快就会耗尽内存。
为什么会发生这种情况?Web 会话时长是一个行为属性的示例,它不保存在任何单个日志记录中;它必须通过在 Web 日志中查找每个会话的第一个和最后一个记录来派生。此派生需要一些复杂的查询表达式和大量内存来连接所有数据点。如果你有一个持续运行的后台进程,将一个索引中的相关事件融合到另一个索引中的以实体为中心的摘要中,你将获得一个更有用、整合的图景。这个新索引有时被称为 数据框 (data frame)。
你可能需要考虑在以下情况下使用 Transforms 而不是聚合:
你需要一个完整的 特征索引 (feature index) 而不是一个 Top-N 的项目集。
在机器学习中,你通常需要一个完整的行为特征集,而不仅仅是 Top-N。例如,如果你正在预测客户流失,你可能会关注过去一周的网站访问次数、总销售额或发送的电子邮件数量等特征。Elastic Stack 的机器学习功能基于这个多维特征空间创建模型,因此它们受益于 Transforms 创建的完整特征索引。
当尝试跨聚合结果或多个聚合结果进行搜索时,此场景也适用。聚合结果可以排序或过滤,但对 排序 和 按 bucket 选择器过滤 有 限制,其中过滤受返回的最大 bucket 数量的约束。如果你想搜索所有聚合结果,你需要创建完整的数据框。如果你需要按多个字段对聚合结果进行排序或过滤,Transforms 会特别有用。
你需要按管道聚合 (pipeline aggregation) 对聚合结果进行排序。
管道聚合 不能用于排序。从技术上讲,这是因为管道聚合在所有其他聚合完成后在 Reduce 阶段运行。如果你创建一个 Transform,你可以有效地对数据进行多次传递。
你想要创建汇总表以优化查询。
例如,如果你有一个高层仪表板,有大量用户访问,并且该仪表板对大型数据集使用复杂的聚合,那么创建一个 Transform 来缓存结果可能会更有效。这样,每个用户都不需要运行聚合查询。
你需要处理延迟到达的数据。
在某些情况下,数据在 Transform 运行时可能不可用,导致目标索引中缺少记录。这可能是由于摄取延迟,文档在索引后需要几秒钟或几分钟才能被搜索到。为了解决这个问题,Transform 的 sync 配置中的
delay参数允许你推迟处理新数据。Transform 不会始终查询最新的记录,而是会跳过一小段时间(例如 60 秒),以确保所有相关数据都已到达后再进行处理。例如,如果一个 Transform 每 5 分钟运行一次,它通常会处理从 5 分钟前到当前时间的数据。然而,如果你将
delay设置为 60 秒,Transform 将处理从 6 分钟前到 1 分钟前的数据,确保包含任何延迟到达的文档。通过调整delay参数,你可以在保持近实时结果的同时,提高转换数据的准确性。