运行时字段

编辑

运行时字段是在查询时进行评估的字段。运行时字段使您能够:

  • 在不重新索引数据的情况下向现有文档添加字段
  • 在不了解数据结构的情况下开始使用数据
  • 在查询时覆盖从索引字段返回的值
  • 为特定用途定义字段,而无需修改底层模式

您可以像访问其他任何字段一样从搜索 API 访问运行时字段,并且 Elasticsearch 对待运行时字段的方式没有区别。您可以在索引映射中或在搜索请求中定义运行时字段。您的选择,是运行时字段固有灵活性的一部分。

_search API 上使用 fields 参数来检索运行时字段的值。运行时字段不会显示在 _source 中,但 fields API 适用于所有字段,即使是那些未作为原始 _source 一部分发送的字段也是如此。

运行时字段在处理日志数据时非常有用(请参阅示例),尤其是在您不确定数据结构时。您的搜索速度会降低,但索引大小会小得多,并且您可以更快地处理日志,而无需对其进行索引。

好处

编辑

由于运行时字段没有被索引,因此添加运行时字段不会增加索引大小。您可以在索引映射中直接定义运行时字段,从而节省存储成本并提高摄取速度。您可以更快地将数据摄取到 Elastic Stack 中并立即访问它。当您定义运行时字段时,您可以立即在搜索请求、聚合、过滤和排序中使用它。

如果您将运行时字段更改为索引字段,则无需修改任何引用运行时字段的查询。更好的是,您可以引用某些字段是运行时字段的索引,以及其他字段是索引字段的索引。您可以灵活地选择要索引的字段以及要保留为运行时字段的字段。

核心而言,运行时字段最重要的好处是能够在摄取文档后向文档添加字段。此功能简化了映射决策,因为您不必预先决定如何解析数据,并且可以随时使用运行时字段来修改映射。使用运行时字段可以减少索引大小并缩短摄取时间,从而减少资源使用并降低运营成本。

动机

编辑

运行时字段可以取代许多使用 _search API 进行脚本编写的方式。您如何使用运行时字段取决于包含的脚本运行的文档数量。例如,如果您在 _search API 上使用 fields 参数来检索运行时字段的值,则该脚本仅针对最热门的结果运行,就像脚本字段一样。

您可以使用脚本字段来访问 _source 中的值,并根据脚本估算返回计算值。运行时字段具有相同的功能,但提供了更大的灵活性,因为您可以在搜索请求中查询和聚合运行时字段。脚本字段只能获取值。

同样,您可以编写一个脚本查询,根据脚本过滤搜索请求中的文档。运行时字段提供了一个非常相似的、更灵活的功能。您可以编写脚本来创建字段值,并且它们在任何地方都可用,例如 fields所有查询聚合

您还可以使用脚本来对搜索结果进行排序,但同一个脚本在运行时字段中的工作方式完全相同。

如果您将脚本从搜索请求中的任何这些部分移动到从相同数量的文档计算值的运行时字段,则性能应该大致相同。这些功能的性能很大程度上取决于包含的脚本正在运行的计算以及脚本运行的文档数量。

妥协

编辑

运行时字段使用更少的磁盘空间,并提供访问数据的灵活性,但可能会根据运行时脚本中定义的计算影响搜索性能。

为了平衡搜索性能和灵活性,索引您将经常搜索和过滤的字段,例如时间戳。Elasticsearch 在运行查询时会自动首先使用这些索引字段,从而实现快速响应时间。然后,您可以使用运行时字段来限制 Elasticsearch 需要计算值的字段数量。将索引字段与运行时字段结合使用,可以在您索引的数据以及如何为其他字段定义查询方面提供灵活性。

使用异步搜索 API 来运行包含运行时字段的搜索。这种搜索方法有助于抵消在每个包含该字段的文档中计算运行时字段的值对性能的影响。如果查询无法同步返回结果集,您将异步获得可用的结果。

针对运行时字段的查询被认为是开销大的。如果 search.allow_expensive_queries 设置为 false,则不允许开销大的查询,Elasticsearch 将拒绝任何针对运行时字段的查询。