运行时字段
编辑运行时字段编辑
运行时字段是在查询时计算的字段。运行时字段使您能够
- 在不重新索引数据的情况下向现有文档添加字段
- 在不了解数据结构的情况下开始使用您的数据
- 在查询时覆盖从索引字段返回的值
- 为特定用途定义字段,而无需修改底层模式
您可以像访问其他字段一样从搜索 API 访问运行时字段,Elasticsearch 对运行时字段的处理方式与其他字段相同。您可以在 索引映射 或 搜索请求 中定义运行时字段。您可以选择哪种方式,这是运行时字段固有灵活性的体现。
使用 fields
参数在 _search
API 上 检索运行时字段的值。运行时字段不会显示在 _source
中,但 fields
API 适用于所有字段,即使是那些未作为原始 _source
部分发送的字段。
运行时字段在处理日志数据时很有用(参见 示例),尤其是在您不确定数据结构时。您的搜索速度会降低,但您的索引大小会更小,您可以更快地处理日志,而无需对其进行索引。
优势编辑
由于运行时字段不会被索引,因此添加运行时字段不会增加索引大小。您可以在索引映射中直接定义运行时字段,从而节省存储成本并提高摄取速度。您可以更快地将数据摄取到 Elastic Stack 并立即访问它。当您定义运行时字段时,您可以立即在搜索请求、聚合、过滤和排序中使用它。
如果您将运行时字段更改为索引字段,则无需修改任何引用运行时字段的查询。更妙的是,您可以引用某些字段是运行时字段的索引,以及其他字段是索引字段的索引。您可以灵活地选择要索引的字段以及要保留为运行时字段的字段。
从根本上说,运行时字段最重要的优势是能够在您摄取数据后向文档添加字段。此功能简化了映射决策,因为您不必事先决定如何解析数据,并且可以使用运行时字段随时修改映射。使用运行时字段可以实现更小的索引和更快的摄取时间,这两种方法结合使用可以减少资源使用并降低运营成本。
激励编辑
运行时字段可以替代您使用 _search
API 的许多脚本使用方式。您使用运行时字段的方式会受到包含的脚本针对的文档数量的影响。例如,如果您使用 _search
API 上的 fields
参数 检索运行时字段的值,则脚本仅针对顶级匹配项运行,就像脚本字段一样。
您可以使用 脚本字段 访问 _source
中的值,并根据脚本评估返回计算值。运行时字段具有相同的功能,但提供了更大的灵活性,因为您可以在搜索请求中查询和聚合运行时字段。脚本字段只能获取值。
类似地,您可以编写一个 脚本查询,该查询根据脚本在搜索请求中过滤文档。运行时字段提供了一个非常类似的功能,但更灵活。您可以编写一个脚本创建字段值,这些值在任何地方都可用,例如 fields
、所有查询 和 聚合。
您还可以使用脚本 对搜索结果进行排序,但相同的脚本在运行时字段中也具有完全相同的效果。
如果您将脚本从搜索请求中的任何这些部分移动到一个从相同数量的文档计算值的运行时字段,则性能应该大致相同。这些功能的性能在很大程度上取决于包含的脚本正在运行的计算以及脚本针对的文档数量。
折衷方案编辑
运行时字段使用更少的磁盘空间,并提供访问数据的灵活性,但会根据运行时脚本中定义的计算影响搜索性能。
为了平衡搜索性能和灵活性,请索引您将经常搜索和过滤的字段,例如时间戳。Elasticsearch 在运行查询时会自动优先使用这些索引字段,从而实现快速响应时间。然后,您可以使用运行时字段来限制 Elasticsearch 需要为其计算值的字段数量。将索引字段与运行时字段结合使用,可以灵活地选择要索引的数据以及如何为其他字段定义查询。
使用 异步搜索 API 运行包含运行时字段的搜索。这种搜索方法有助于抵消在包含该字段的每个文档中为运行时字段计算值带来的性能影响。如果查询无法同步返回结果集,您将获得异步结果,这些结果将在可用时提供。
针对运行时字段的查询被认为是昂贵的。如果 search.allow_expensive_queries
设置为 false
,则不允许昂贵的查询,Elasticsearch 将拒绝针对运行时字段的任何查询。