【Elasticsearch】runtime_mappings搜索请求中定义运行时字段

embedded/2025/2/19 16:35:32/

在 Elasticsearch 中,在搜索请求中定义运行时字段(Runtime Fields)是一种强大的功能,允许用户在查询时动态添加和计算字段,而无需预先在索引映射中定义这些字段。这种方式提供了极大的灵活性,尤其是在处理动态数据结构或需要临时计算字段值的场景中。

运行时字段的核心概念

运行时字段基于“读时模式(Schema on Read)”的概念,允许用户在查询时定义字段的映射和计算逻辑。与传统的索引字段不同,运行时字段不会被存储或索引,因此不会增加存储成本。它们仅在查询执行时动态计算,并可用于查询、聚合和排序。

在搜索请求中定义运行时字段

运行时字段可以通过在搜索请求中添加`runtime_mappings`部分来定义。其语法与在索引映射中定义运行时字段的语法相同。例如:

```json

GET my-index-000001/_search

{

  "runtime_mappings": {

    "day_of_week": {

      "type": "keyword",

      "script": {

        "source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ENGLISH))"

      }

    }

  },

  "query": {

    "match_all": {}

  },

  "aggs": {

    "day_of_week_terms": {

      "terms": {

        "field": "day_of_week"

      }

    }

  }

}

```

在这个例子中:

1. `runtime_mappings`部分定义了一个名为`day_of_week`的运行时字段,其类型为`keyword`。

2. 使用 Painless 脚本从`@timestamp`字段计算出一周中的某一天(如“Monday”)。

3. 该字段可以用于查询、聚合或排序。

运行时字段的优势

1. 动态性:运行时字段允许在查询时动态计算字段值,无需预先索引。

2. 节省存储空间:由于运行时字段不会被存储或索引,因此不会增加索引的存储成本。

3. 灵活性:运行时字段可以覆盖索引映射中已有的字段,或者添加新的字段,而无需修改索引结构。

4. 查询功能:运行时字段支持几乎所有的查询功能,包括聚合、过滤和排序。

使用场景

运行时字段适用于以下场景:

1. 动态数据结构:当数据结构不固定或需要动态解析字段时。

2. 临时字段:当需要临时计算字段值而不存储这些值时。

3. 纠正索引映射错误:如果字段被错误地映射为不适合的类型(如将数值字段映射为`text`),运行时字段可以覆盖这些字段的类型。

运行时字段的限制

尽管运行时字段提供了极大的灵活性,但它们也有一些限制:

1. 性能影响:由于运行时字段是在查询时动态计算的,因此可能会对查询性能产生一定影响。

2. 不可用于`_source`:运行时字段不会出现在`_source`中,只能通过`fields`参数返回。

示例:使用运行时字段进行聚合

假设您需要对某个字段进行聚合,但该字段未被索引为合适的类型,您可以使用运行时字段来解决这个问题。例如:

```json

PUT my-index-000001/_mapping

{

  "runtime": {

    "measures.start": {

      "type": "long"

    }

  }

}

 

GET my-index-000001/_search

{

  "aggs": {

    "avg_start": {

      "avg": {

        "field": "measures.start"

      }

    }

  }

}

```

在这个例子中,运行时字段`measures.start`被定义为`long`类型,从而可以对其进行聚合。

总结

运行时字段是 Elasticsearch 中一种强大的功能,允许用户在查询时动态定义和计算字段值。它们提供了灵活性和动态性,同时节省了存储空间。然而,运行时字段可能会对查询性能产生一定影响,因此需要根据具体场景进行权衡。

 


http://www.ppmy.cn/embedded/162383.html

相关文章

Docker 常用命令基础详解(一)

一、Docker 初相识 在当今数字化时代,软件开发和部署的效率与灵活性成为了关键因素。Docker,作为一款开源的应用容器引擎,犹如一颗璀璨的明星,照亮了软件开发与部署的道路,为开发者们带来了前所未有的便利。它就像是一…

万字长文破解 AI 图片生成算法-Stable diffusion

想象一下:你闭上眼睛,脑海中构思一个场景,用简短的语言描述出来,然后“啪”的一声,一张栩栩如生的图片就出现在你眼前。这不再是科幻小说里才有的情节,而是StableDiffusion——一种前沿的AI图片生成算法——…

[matlab优化算法-18期】基于遗传算法的模糊PID控制优化

遗传算法优化模糊PID控制器:原理与实践 第一节:背景介绍 在现代控制系统中,PID控制器因其结构简单、参数调整方便而被广泛应用。然而,传统PID控制器的参数整定依赖于经验或试错法,难以适应复杂系统的动态变化。模糊控…

Okay, But Please Don’t Stop Talking

Okay, But Please Don’t Stop Talking 研发背景 现有问题:像ChatGPT的高级语音模式这类先进的语音对语音系统,容易被“我明白”“嗯哼”等在人类对话中常见的插入语打断。这表明现有语音交互系统在处理自然对话中的语音重叠情况时存在不足。 新的尝试&…

C++-----------酒店客房管理系统

酒店客房管理系统 要求: 1.客房信息管理:包括客房的编号、类型、价格、状态等信息的录入和修改; 2.顾客信息管理:包括顾客的基本信息、预订信息等的管理; 3.客房预订:客户可以根据需要进行客房的预订,系统会自动判断客房的可用情况; 4.入住管理:客户入住…

在vs code中运行python程序时,将解释器设置为uv虚拟环境构建的解释器。

在VS Code中运行Python程序时,正确配置虚拟环境解释器是项目依赖管理的重要环节。以下是如何使用uv工具创建虚拟环境并在VS Code中切换解释器的完整流程: 一、uv虚拟环境创建 安装uv工具 pip install uv创建虚拟环境 在项目根目录执行以下命令&#xff0…

借助 Docker 环境变量,实现1分钟上线在线客服系统

最新版本的客服系统 Docker 镜像加入了对环境变量的支持,可以在 docker run 时直接指定域名和IP,一键上线,不再需要进入容器内修改配置文件。 从 Docker Hub 下载服务器镜像 docker pull iccb1013/linkup:latest 用以下启动命令为例&#x…

用vue3写一个好看的wiki前端页面

以下是一个使用 Vue 3 Element Plus 实现的 Wiki 风格前端页面示例&#xff0c;包含现代设计、响应式布局和常用功能&#xff1a; <template><div class"wiki-container"><!-- 头部导航 --><el-header class"wiki-header"><d…