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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

汽车智能制造企业数字化转型SAP解决方案总结

一、项目实施概述 项目阶段划分: 蓝图设计阶段主数据管理方案各模块蓝图设计方案下一阶段工作计划 关键里程碑: 2022年6月6日:项目启动会2022年12月1日:系统上线 二、总体目标 通过SAP实施,构建研产供销协同、业财一…

JavaWeb-在idea中配置Servlet项目

文章目录 在idea中进行Servlet项目的配置(较新的idea版本)创建一个空的JavaSE项目(Project)创建一个普通的JavaSE板块(module)添加Web项目的配置定义一个对象模拟实现接口在web.xml中配置路径映射配置项目到Tomcat服务器启动Tomcat服务器进行测试 在idea中进行Servlet项目的配置…

【深度学习神经网络学习笔记(二)】神经网络基础

神经网络基础 神经网络基础前言1、Logistic 回归2、逻辑回归损失函数3、梯度下降算法4、导数5、导数计算图6、链式法则7、逻辑回归的梯度下降 神经网络基础 前言 Logistic 回归是一种广泛应用于统计学和机器学习领域的广义线性回归模型,主要用于解决二分类问题。尽…

力扣hot100 —— 电话号码字母组合; 子集 (非回溯做法)简单易懂

由于博主对回溯也不是很熟悉,这里提出一种简单易懂的解法(有点暴力) 解题思路: 每个数字对应有自己的字母串; 首先遍历将每个字母存入也就是 res{{a},{b},{c}} 然后遍历后续数子对应的字母,让每个字母与…

React 源码揭秘 | 更新队列

前面几篇遇到updateQueue的时候,我们把它先简单的当成了一个队列处理,这篇我们来详细讨论一下这个更新队列。 有关updateQueue中的部分,可以见源码 UpdateQueue实现 Update对象 我们先来看一下UpdateQueue中的内容,Update对象&…

解锁养生密码,拥抱健康生活

在快节奏的现代生活中,养生不再是一种选择,而是我们保持活力、提升生活质量的关键。它不是什么高深莫测的学问,而是一系列融入日常的简单习惯,每一个习惯都在为我们的健康加分。 早晨,当第一缕阳光洒进窗户&#xff0c…

muduo网络库2

Muduo网络库:底层实质上为Linux的epoll pthread线程池,且依赖boost库。 muduo的网络设计核心为一个线程一个事件循环,有一个main Reactor负载accept连接,然后把连接分发到某个sub Reactor(采用轮询的方式来选择sub Reactor)&…

【大语言模型】【整合版】DeepSeek 模型提示词学习笔记(散装的可以看我之前的学习笔记,这里只是归纳与总结了一下思路,内容和之前发的差不多)

以下是个人笔记的正文内容: 原文在FlowUs知识库上,如下截图。里面内容和这里一样,知识排版好看一点 一、什么是 DeepSeek 1. DeepSeek 简介 DeepSeek 是一家专注于通用人工智能(AGI)的中国科技公司,主攻大模型研发与…

AWQ和GPTQ量化的区别

一、前言 本地化部署deepseek时发现,如果是量化版的deepseek,会节约很多的内容,然后一般有两种量化技术,那么这两种量化技术有什么区别呢? 二、量化技术对比 在模型量化领域,AWQ 和 GPTQ 是两种不同的量…

ARM Cortex-M3 技术解析:核寄存器R1-R15介绍及使用

ARM Cortex-M3 技术解析:核寄存器R1-R15介绍及使用 作为嵌入式开发领域的经典处理器内核,ARM Cortex-M3(CM3)凭借其高效能、低功耗和丰富特性,在工业控制、物联网、消费电子等领域广泛应用。而内核寄存器是我们调试代…

ROS ur10机械臂添加140夹爪全流程记录

ROS ur10机械臂添加140夹爪 系统版本:Ubuntu20.04 Ros版本:noetic Moveit版本:moveit-noetic 参考博客: ur3robotiq ft sensorrobotiq 2f 140配置rviz仿真环境_有末端力传感器的仿真环境-CSDN博客 UR5机械臂仿真实例&#xf…

Web自动化之Selenium添加网站Cookies实现免登录

在使用Selenium进行Web自动化时,添加网站Cookies是实现免登录的一种高效方法。通过模拟浏览器行为,我们可以将已登录状态的Cookies存储起来,并在下次自动化测试或爬虫任务中直接加载这些Cookies,从而跳过登录步骤。 Cookies简介 …

【落羽的落羽 数据结构篇】树、二叉树

文章目录 一、树1. 树的概念和结构2. 树的相关术语 二、二叉树1. 概念与结构2. 满二叉树3. 完全二叉树4. 二叉树的性质5. 二叉树的存储结构 一、树 1. 树的概念和结构 之前我们学习了线性表,今天我们再来接触一种全新的数据结构——树。 树是一种非线性的数据结构…

数据结构(陈越,何钦铭) 第四讲 树(中)

4.1 二叉搜索树 4.1.1 二叉搜索树及查找 Position Find(ElementTyoe X,BinTree BST){if(!BST){return NULL;}if(X>BST->Data){return Find(X,BST->Right)}else if(X<BST->Data){return Find(X,BST->Left)}else{return BST;} } Position IterFind(ElementTyp…

【原创工具】同文件夹PDF文件合并 By怜渠客

【原创工具】同文件夹PDF文件合并 By怜渠客 原贴&#xff1a;可批量合并多个文件夹内的pdf工具 - 吾爱破解 - 52pojie.cn 他这个存在一些问题&#xff0c;并非是软件内自主实现的PDF合并&#xff0c;而是调用的pdftk这一工具&#xff0c;但楼主并没有提供pdftk&#xff0c;而…

Kafka系列之:记录一次源头数据库刷数据,造成数据丢失的原因

Kafka系列之:记录一次源头数据库刷数据,造成数据丢失的原因 一、背景二、查看topic日志信息三、结论四、解决方法一、背景 源头数据库在很短的时间内刷了大量的数据,部分数据在hdfs丢失了 理论上debezium数据采集不会丢失,就需要排查数据链路某个节点是否有数据丢失。 数据…

llama.cpp 一键运行本地大模型 - Windows

文章目录 llama.cpp 一键运行本地大模型 - Windows嘿&#xff0c;咱来唠唠 llama.cpp 这玩意儿&#xff01;gguf 格式是啥&#xff1f;咱得好好说道说道基座模型咋选&#xff1f;所需物料&#xff0c;咱得准备齐全咯核心命令&#xff0c;得记牢啦运行方式咋选&#xff1f;测试应…

BGP状态和机制

BGP邻居优化 为了增加稳定性,通常建议实验回环口来建立邻居。更新源:建立邻居和邻居所学习到的路由的下一跳。多跳:EBGP邻居建立默认选哟直连,因为TTL=1,如果非直连,必须修改TTL。命令备注peer 2.2.2.2 connect-interface lo1配置更新源peer 2.2.2.2 ebgp-max-hop 2配置T…

Holoens2开发报错记录02_通过主机获取彩色和深度数据流常见错误

01.E1696 E1696 无法打开源文件 “stdio.h” 解决方法&#xff1a; 更新一下SDK 1&#xff09;打开Visual Studio Installer&#xff0c;点击修改 2&#xff09;安装详细信息中自己系统对应的SDK&#xff0c;点击修改即可 02.WinError 10060 方法来源 解决方法&#xff1a…