`script_fields`和`runtime_fields`都是 Elasticsearch 中用于动态计算字段值的功能,但它们在实现方式、应用场景和性能表现上存在显著区别。以下是两者的详细对比:
1.定义和应用场景
• `script_fields`:
• 定义:通过 Painless 脚本在查询阶段动态计算字段值。
• 应用场景:主要用于在查询结果中添加额外的计算字段,这些字段不会影响查询的执行逻辑。
• 示例:计算文档中多个字段的平均值,或基于字段值进行复杂计算。
• `runtime_fields`:
• 定义:在查询时动态定义字段,支持“读时模式”(Schema on Read),允许在查询时修改数据结构。
支持“读时模式”(Schema on Read)
• 读时模式(Schema on Read):
• 在“读时模式”中,数据结构(即字段的定义)是在查询时动态解析和定义的,而不是在数据写入时预先定义。
• 这与传统的“写时模式”(Schema on Write)形成对比,在“写时模式”中,数据结构必须在索引阶段预先定义,且难以修改。
• 优点:• 灵活性:可以在查询时动态调整字段的定义,无需重新索引数据。
• 动态性:可以基于实时数据动态计算字段值,支持复杂的逻辑。
• 无需预定义:无需在索引阶段预先定义字段,减少了索引阶段的复杂性。
• 缺点:
• 性能开销:由于字段值是在查询时动态计算的,可能会增加查询的计算开销。
• 复杂性:脚本的编写和调试可能需要一定的技术能力。
• 应用场景:适用于需要在查询时动态添加字段、修改字段值,或基于这些字段进行过滤、排序和聚合。
• 示例:动态添加字段用于过滤、排序,或从其他索引中检索字段值(lookup runtime fields)。
2.执行阶段和性能
• `script_fields`:
• 执行阶段:在查询的fetch 阶段执行,即在文档被检索后才计算字段值。
• 性能影响:对查询性能的影响较小,但无法用于过滤、排序或聚合。
• `runtime_fields`:
• 执行阶段:从查询的开始阶段就参与计算,因此可以用于过滤、排序和聚合。
• 性能影响:由于在查询时动态计算,可能会对查询性能产生较大影响,尤其是在处理大量文档时。
3.索引和存储
• `script_fields`:
• 索引:不存储也不索引,仅在查询结果中返回。
• 存储:不占用额外的存储空间。
你的总结非常准确!`runtime_fields`是 Elasticsearch 中一个非常灵活的功能,它允许你在查询时动态定义和计算字段,而不需要在索引阶段预先存储这些字段的值。以下是对你总结的进一步详细解释:
---
1.不存储也不索引,但可以通过`fields`参数返回
• 不存储也不索引:
• `runtime_fields`是在查询时动态计算的,它们不会被存储在索引中,也不会被倒排索引(inverted index)。这意味着它们不会占用额外的磁盘空间,也不会影响索引的大小。
• 由于它们是动态计算的,每次查询时都会根据定义的脚本实时生成字段值。
• 可以通过`fields`参数返回:
• 尽管`runtime_fields`不存储,但你可以在查询结果中通过`fields`参数返回这些字段的值。这类似于`script_fields`的行为,但`runtime_fields`更灵活,因为它们可以用于过滤、排序和聚合。
示例:
```json
GET /myindex/_search
{
"query": {
&nbs

最低0.47元/天 解锁文章
833

被折叠的 条评论
为什么被折叠?



