【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`是更灵活的选择。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23912.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全星FMEA软件系统是一款高效、智能的失效模式及影响分析工具,广泛应用于汽车、电子、机械等行业

全星FMEA软件系统是一款高效、智能的失效模式及影响分析工具,广泛应用于汽车、电子、机械等行业。该系统基于2019版FMEA手册开发,严格遵循七步方法,能够全面识别潜在风险并提前制定应对措施。 全星FMEA软件系统功能特点 自动化分析&#xff…

ROS的action通信——实现阶乘运算(一)

在ROS中除了常见的话题(topic)通信、服务(server)通信等方式,还有action通信这一方式,由于可以实时反馈任务完成情况,该通信方式被广泛运用于机器人导航等任务中。本文将通过三个小节的分享,实现基于action通信的阶乘运…

一文读懂什么是K8s Admission Controller

#作者:曹付江 文章目录 1、什么是 Admission Controllers?2、如何创建 Admission Controllers?3、Admission 控制器的最佳实践 K8s 中的操作与安全标准执行机制: 1、什么是 Admission Controllers? Admission contro…

vue3:vue3项目安装并引入Element-plus

一、安装Element-plus 1、安装语句位置 安装 | Element Plushttps://element-plus.org/zh-CN/guide/installation.html根据所需进行安装,这里使用npm包 2、找到项目位置 找到项目位置,在路径上输入cmd回车打开“运行”窗口 输入安装语句回车完成安装 …

【C/C++】理解C++内存与Linux虚拟地址空间的关系---带你通透C++中所有数据

每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论: 本质编写的原因是我在复习过程中突然发现虚拟地址空间和C内存划分我好想有点分不清时,进行查询各类资料和整理各类文章后得出的文章&#xff…

美国国防部(DoD)SysML v2迁移指南项目

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 分享一篇SysML v1向SysML v2迁移的资料。 下载地址:https://ndia.dtic.mil/wp-content/uploads/2023/systems/Thurs_1560710_Stirk.pdf 核心内容用DeepSeek整理如下&#…

在vscode中编译运行c语言文件,配置并运行OpenMP多线程并行程序设计

1.下载安装vscode Visual Studio Code - Code Editing. Redefined 2.安装vscode扩展 打开vscode,按ctrl+shift+x,打开扩展,搜索c/c++,下载相应的扩展 3.下载MinGW-w64 MinGW-w64 提供了 GNU 编译器集合,可以编译c/c++文件 这里下载见我的资源,可直接下载 把压缩包解压…

Jenkins protoc: command not found

个人博客地址:Jenkins protoc: command not found | 一张假钞的真实世界 在使用Jenkins编译Hadoop3.1.2时报错信息如下: [INFO] --- hadoop-maven-plugins:3.1.2:protoc (compile-protoc) hadoop-common --- [WARNING] [protoc, --version] failed: j…

Linux红帽:RHCSA认证知识讲解(二)配置网络与登录本地远程Linux主机

Linux红帽:RHCSA认证知识讲解(二)配置网络与登录本地远程Linux主机 前言一、使用命令行(nmcli 命令)配置网络,配置主机名第一步第二步修改主机名称 二、使用图形化界面(nmtui 命令)配…

【CMake 教程】基础使用教程(一)

一、准备 1. CMake 官方下载网址 2. 文件目录结构 MySimpleProject ├── CMakeLists.txt # CMake 配置文件 └── main.cpp # 主程序源码我们在 MySimpleProject 目录中创建 CMakeLists.txt 和 main.cpp 两个空白文件。 二、CMake 简单概念 要学会使用 CMake&#xff…

智能网络感知,打造极致流畅的鸿蒙原生版中国移动云盘图文体验

背景 中国移动云盘(原“和彩云网盘”)是中国移动重磅推出的安全、智能、不限速、移动用户免流的智能云盘,致力于成为5G时代用户个人与家庭的数字资产管理中心,是中国移动继语音、短信、流量后的“第四项基础服务”。 照片、音视…

Windows 11【1001问】Windows 11系统硬件配置要求

Windows 11 的设计目标是让用户更贴近自己喜欢的内容,在其发布之际,计算机在连接、创作以及游戏体验方面扮演了更加核心的角色。在设定 Windows 11 的最低系统要求时,我们依据三个关键原则来指导决策,以确保用户能够获得卓越的使用…

SQL笔记#函数、谓词、CASE表达式

目录 一、各种各样的函数 1、函数的种类 2、算术函数 ABS——绝对值 MOD——取余 ROUND——四舍五入 3、字符串函数 ||——拼接 LENGTH——字符串长度 LOWER——小写转换 REPLACE——字符串的替换 SUBSTR——字符串的截取 UPPER——大写转换 4、日期函数 CURRENT_DATE——…

为人工智能驱动的交通研究增强路面传感器数据采集

论文标题 英文标题:Enhancing Pavement Sensor Data Harvesting for AI-Driven Transportation Studies 中文标题:为人工智能驱动的交通研究增强路面传感器数据采集 作者信息 Manish Kumar Krishne Gowda Purdue University, 465 Northwestern Avenue,…

简讯:Rust 2024 edition and v1.85.0 已发布

详见 https://blog.rust-lang.org/2025/02/20/Rust-1.85.0.html 升级方法:rustup update stable

clickhouse-介绍、安装、数据类型、sql

1、介绍 ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),使用C语言编写,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。 OLAP(On-Line A…

pycharm技巧--鼠标滚轮放大或缩小 Pycharm 字体大小

1、鼠标滚轮调整字体 设置 Ctrl 鼠标滚轮调整字体大小 备注: 第一个是活动窗口,即缩放当前窗口 第二个是所有编辑器窗口,即缩放所有窗口的字体 2、插件 汉化包: Chinese Simplified 包

R语言安装教程(附安装包)R语言4.3.2版本安装教程

文章目录 前言一、安装包下载二、R-4.3.2安装步骤三、rtools43安装步骤四、RStudio安装步骤 前言 本教程将详细、全面地为你介绍在 Windows 系统下安装 R 语言 4.3.2 的具体步骤。无论你是初涉数据领域的新手,还是希望更新知识体系的专业人士,只要按照本…

从零开始玩转TensorFlow:小明的机器学习故事 5

图像识别的挑战 1 故事引入:小明的“图像识别”大赛 小明从学校里听说了一个有趣的比赛:“美食图像识别”。参赛者需要训练计算机,看一张食物照片(例如披萨、苹果、汉堡等),就能猜出这是什么食物。听起来…

01 冲突域和广播域的划分

目录 1、冲突域和广播域的划分 1.1、冲突域 1.2、广播域 1.3、对比总结 1.4、冲突域与广播域个数计算例题 2、交换机和路由器的结构 2.1、交换机的结构 2.2、路由器的结构 1、冲突域和广播域的划分 1.1、冲突域 冲突域是指网络中可能发生数据帧冲突的物理范围。当多…