【Elasticsearch】script_fields 和 runtime_fields的区别
`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_fields`vs.普通字段 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`是更灵活的选择。
相关文章:
【Elasticsearch】script_fields 和 runtime_fields的区别
script_fields和runtime_fields都是 Elasticsearch 中用于动态计算字段值的功能,但它们在实现方式、应用场景和性能表现上存在显著区别。以下是两者的详细对比: 1.定义和应用场景 • script_fields: • 定义:通过 Painless 脚本…...

城电科技|会追日的智能花,光伏太阳花开启绿色能源新篇章
当艺术与科技相遇,会碰撞出怎样的火花?城电科技推出的光伏太阳花,以其独特的设计与智能化的功能,给出了答案。这款产品不仅具备太阳能发电的实用功能,更是一件充满科技属性的艺术性光伏产品,吸引了广泛关注…...

【笔记ing】C语言补充、组成原理数据表示与汇编实战、操作系统文件实战(高级阶段)
【第19节 C语言语法进阶】 【19.1 条件运算符与逗号运算符】 1 条件运算符 条件运算符是C语言中唯一的一种三亩运算符。三目运算符代表有三个操作数;双目运算符代表有两个操作数,如逻辑运算符就是双目运算符;弹幕运算符代表有一个操作数&a…...

快节奏生活
在当今快节奏的商务环境中,效率成为了决定企业竞争力的关键因素之一。亿可达软件连接平台,以其独特的功能和优势,为职场人士带来了前所未有的便捷与高效,成为了众多用户心中的“宝藏”工具。 1、亿可达:自动化流程的搭…...

【音视频】音视频录制、播放原理
一、音视频录制原理 通常,音视频录制的步骤如下图所示: 我们分别从音频和视频开始采样,通过麦克风和摄像头来接受我们的音频信息和图像信息,这通常是同时进行的,不过,通常视频的采集会比音频的采集慢&…...
前端Sass面试题及参考答案
目录 什么是 Sass? Sass 和 CSS 的主要区别是什么? Sass 中如何处理列表? Sass 中如何处理映射(map)? Sass 中如何使用函数? Sass 中如何使用内置函数? Sass 中如何设置默认值? Sass 中的 @function 和 @mixin 有什么区别? Sass 中如何实现模块化? Sass 中…...

Web自动化之Selenium控制已经打开的浏览器(Chrome,Edge)
在使用selenium进行web自动化或爬虫的时候,经常会面临登录的情况,对于这种情况,我们可以利用Selenium控制已经打开的浏览器,从而避免每次都需要重新打开浏览器并进行登录的繁琐步骤。 目录 说明 启动浏览器 注意 --user-data-dir说明 代码设定 代码 改进代…...
AF3 unify_template_features 函数解读
AlphaFold3 data_pipeline 模块的 unify_template_features 函数用于将多条链的模板特征整合为一个统一的 FeatureDict,以适应对多链复合物的处理。每条链的模板特征经过索引偏移处理后,拼接为一个完整的模板特征矩阵。 该方法的核心在于: 序列对齐:根据每条链的长度,将模…...

FFmpeg.NET:.NET 平台上的音视频处理利器
FFmpeg.NET 是一个封装了 FFmpeg 功能的 .NET 库,能够方便地在 C# 项目中处理音视频文件。它支持多种操作,包括转码、剪辑、合并、分离音频等。 功能 解析元数据从视频生成缩略图使用以下参数将音频和视频转码为其他格式: 码率(…...
解决 Git 合并冲突:当本地修改与远程提交冲突时
目录 错误原因分析 解决方法 1. 暂存本地修改并合并(保留更改) 2. 丢弃本地修改(强制覆盖) 3. 暂存修改后合并(推荐:使用 git stash) 4. 选择性合并(手动处理冲突文件…...

SOME/IP-SD -- 协议英文原文讲解5
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.2.5 S…...

spark的一些指令
一,复制和移动 1、复制文件 格式:cp 源文件 目标文件 示例:把file1.txt 复制一份得到file2.txt 。那么对应的命令就是:cp file1.txt file2.txt 2、复制目录 格式:cp -r 源文件 目标文件夹 示例:把目…...

Redis常用数据类型及其应用案例
文章目录 Redis常用数据类型及其应用案例1. 字符串(String)1.1 简介1.2 应用案例1.2.1 缓存1.2.2 计数器 2. 哈希(Hash)2.1 简介2.2 应用案例2.2.1 存储用户信息2.2.2 购物车 3. 列表(List)3.1 简介3.2 应用…...
kafka数据拉取和发送
文章目录 一、原生 KafkaConsumer1、pom文件引入kafka2、拉取数据3、发送数据二、在spring boot中使用@KafkaListener1、添加依赖2、application.yml3、消息拉取:consumer4、自定义ListenerContainerFactory5、消息发送:producer6、kafka通过clientId鉴权时的鉴权失败问题一、…...
LLM全栈框架完整分类清单(预训练+微调+工具链)
一、预训练框架 1. 大规模分布式训练框架 框架名称核心能力GitHub地址Megatron-LM3D并行训练、FlashAttention支持、Transformer架构优化(NVIDIA生态)NVIDIA/Megatron-LMDeepSpeedZeRO优化系列、3D并行、RLHF全流程支持(微软生态)…...

蓝桥杯备考:贪心算法之矩阵消除游戏
这道题是牛客上的一道题,它呢和我们之前的排座位游戏非常之相似,但是,排座位问题选择行和列是不会改变元素的值的,这道题呢每每选一行都会把这行或者这列清零,所以我们的策略就是先用二进制把选择所有行的情况全部枚举…...

【Matlab仿真】Matlab Function中如何使用静态变量?
背景 根据Simulink的运行机制,每个采样点会调用一次MATLAB Function的函数,两次调用之间,同一个变量的前次计算的终值如何传递到当前计算周期来?其实可以使用persistent变量实现函数退出和进入时内部变量值的保持。 persistent变…...

DeepSeek 提示词:高效的提示词设计
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...

深入学习Java中的Lambda表达式
深入学习Java中的Lambda表达式 自Java 8引入以来,Lambda表达式彻底改变了Java的编程风格,让代码变得更加简洁、易读,尤其是在函数式编程的场景中。接下来,我们将深入探讨Lambda表达式的语法、原理以及实际应用,帮助你…...
1.2 AI 量化炒股的起源与发展
**定性价值**:AI量化炒股通过算法模型实现投资决策自动化,显著提升交易效率与风险控制能力,打破传统人工交易的主观性与延迟性,推动金融科技向智能化、数据驱动方向迭代,具有颠覆传统投资模式的战略意义。 **定量价值…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...