网站运营和网络营销,软装设计培训一般多少钱,网站注册的账号怎么注销,注册公司地址虚拟地址怎么申请script_fields和runtime_fields都是 Elasticsearch 中用于动态计算字段值的功能#xff0c;但它们在实现方式、应用场景和性能表现上存在显著区别。以下是两者的详细对比#xff1a;
1.定义和应用场景
• script_fields#xff1a;
• 定义#xff1a;通过 Painless 脚本…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: { match_all: {} }, fields: [runtime_field_name]
} ---
2.不占用额外的存储空间但可以动态添加到索引的映射中
• 不占用额外的存储空间
• 由于runtime_fields是在查询时动态计算的它们不会像普通字段那样占用磁盘空间。这使得runtime_fields非常适合处理临时或动态生成的数据而不需要担心存储成本。
• 可以动态添加到索引的映射中
• runtime_fields可以通过更新索引的映射mapping动态添加到索引中。这意味着你可以在不重新索引数据的情况下随时添加新的字段定义。
• 这种动态性使得runtime_fields非常灵活尤其是在处理动态数据结构或临时需求时。
示例动态添加runtime_field
json
PUT /myindex/_mapping
{ runtime: { runtime_field_name: { type: double, script: { source: emit(doc[field1].value doc[field2].value) } } }
} ---
对比runtime_fieldsvs.普通字段 vs.script_fields 特性 runtime_fields 普通字段 script_fields **存储** 不存储不占用磁盘空间 存储占用磁盘空间 不存储不占用磁盘空间 **索引** 不索引但可以动态添加到映射 索引支持快速查询 不索引仅在查询结果中返回 **动态性** 动态计算支持过滤、排序、聚合 静态存储适合快速查询 动态计算仅支持查询结果 **性能** 查询时计算可能影响性能 预存储查询性能高 查询时计算可能影响性能 **灵活性** 动态添加字段无需重新索引 需要预先定义难以修改 动态计算适合简单逻辑
---
总结
• runtime_fields
• 不存储也不索引但可以通过fields参数返回。
• 不占用额外的存储空间但可以动态添加到索引的映射中。
• 适合动态计算、过滤、排序和聚合但可能影响查询性能。
• 普通字段
• 存储并索引适合快速查询。
• 需要预先定义难以动态修改。
• script_fields
• 不存储也不索引仅在查询结果中返回。
• 适合简单的动态计算但不支持过滤、排序和聚合。
通过合理选择runtime_fields、普通字段或script_fields你可以根据具体需求优化 Elasticsearch 的查询性能和灵活性。
• runtime_fields
• 索引不存储也不索引但可以通过fields参数返回。
• 存储不占用额外的存储空间但可以动态添加到索引的映射中。
4.灵活性和动态性
• script_fields
• 灵活性仅在查询时动态计算无法用于过滤或排序。
• 动态性适合简单的计算和装饰性字段。
• runtime_fields
• 灵活性可以在查询时动态定义支持过滤、排序和聚合。
• 动态性支持动态添加和删除字段无需重新索引数据。
5.示例对比
使用script_fields
json
GET runtime_test/_search
{ query: { match_all: {} }, script_fields: { avg: { script: { source: (doc[participations.race1.time_secs].value doc[participations.race2.time_secs].value doc[participations.race3.time_secs].value)/3; } } }
} • 结果返回每个文档的平均值但无法用于过滤。
使用runtime_fields
json
PUT runtime_test/_mapping
{ runtime: { times_average: { type: double, script: { source: emit((doc[participations.race1.time_secs].value doc[participations.race2.time_secs].value doc[participations.race3.time_secs].value)/3); } } }
} GET runtime_test/_search
{ query: { range: { times_average: { gte: 100, lte: 200 } } }
} • 结果可以用于过滤、排序和聚合。
在 Elasticsearch 中runtime_fields的一个关键特性是它们可以在查询时动态计算并且可以像普通字段一样用于过滤、排序和聚合。这意味着你可以在查询中对动态计算的字段执行复杂的操作而不需要预先在索引中存储这些字段的值。
让我们详细解释一下你的问题中的代码示例以及runtime_fields如何支持过滤、排序和聚合。
---
示例代码
定义runtime_field
json
PUT runtime_test/_mapping
{ runtime: { times_average: { type: double, script: { source: emit((doc[participations.race1.time_secs].value doc[participations.race2.time_secs].value doc[participations.race3.time_secs].value)/3); } } }
} 使用runtime_field进行查询
json
GET runtime_test/_search
{ query: { range: { times_average: { gte: 100, lte: 200 } } }
} ---
1.过滤Filtering
在查询中runtime_fields可以像普通字段一样用于过滤操作。例如上述查询中使用了range查询对times_average字段进行了范围过滤
• gte: 100表示只返回times_average大于或等于 100 的文档。
• lte: 200表示只返回times_average小于或等于 200 的文档。
这意味着你可以根据动态计算的字段值过滤文档而不需要预先存储这些值。
---
2.排序Sorting
runtime_fields也可以用于排序。例如你可以根据times_average字段对结果进行排序
json
GET runtime_test/_search
{ query: { match_all: {} }, sort: [ { times_average: { order: desc } } ]
} • 这个查询会根据times_average字段的值对文档进行降序排序。
• 由于times_average是动态计算的排序操作会基于动态计算的结果进行。 ---
3.聚合Aggregation
runtime_fields还可以用于聚合操作。例如你可以计算times_average字段的平均值、最大值或最小值
json
GET runtime_test/_search
{ size: 0, aggs: { avg_times_average: { avg: { field: times_average } }, max_times_average: { max: { field: times_average } } }
} • 这个查询会计算times_average字段的平均值和最大值。
• 由于times_average是动态计算的聚合操作会基于动态计算的结果进行。
---
为什么runtime_fields可以用于过滤、排序和聚合
1. 动态计算
• runtime_fields在查询时动态计算计算结果会临时存储在内存中因此可以像普通字段一样被查询引擎使用。
• 这种动态计算的方式允许你在查询时定义复杂的逻辑而不需要预先存储这些字段的值。
2. 灵活性
• 你可以根据需要动态添加或修改runtime_fields而不需要重新索引数据。
• 这使得runtime_fields非常适合处理动态数据结构或临时需求。
3. 性能
• 虽然runtime_fields的计算会增加查询的计算开销但它们的灵活性和动态性使得它们在某些场景下非常有用。
• 对于复杂的查询逻辑runtime_fields提供了一种高效的方式来实现。
---
总结
• 过滤runtime_fields可以用于范围查询、匹配查询等过滤操作。
• 排序可以基于runtime_fields的值对文档进行排序。
• 聚合可以对runtime_fields进行聚合操作如计算平均值、最大值等。
通过合理使用runtime_fields你可以实现更灵活的查询逻辑同时避免在索引阶段进行复杂的数据预处理。
总结
• 如果你需要在查询结果中添加简单的计算字段且不希望影响查询性能script_fields是一个不错的选择。
• 如果你需要动态定义字段并希望这些字段支持过滤、排序和聚合runtime_fields是更灵活的选择。