elasticsearch中使用runtime fields

news2024/10/7 15:30:08

1、背景

在我们使用es的开发过程中可能会遇到这么一种情况,比如我们的线路名称字段lineName字段在设置mapping的时候使用的是text类型,但是后期发现需要使用这个字段来进行聚合操作,那么我们除了对索引进行reindex操作外,还有什么办法可以解决这个问题呢?此处我们通过runtime field来解决。

2、runtime field介绍

2.1 runtime field可以实现的功能

运行时字段是在查询时评估的字段。是在es7.11之后增加的运行时字段使您能够:

  1. 将字段添加到现有文档,而无需重新索引数据
  2. 在不了解数据结构的情况下开始处理数据
  3. 在查询时覆盖从索引字段返回的值
  4. 定义特定用途的字段,而不修改原始mapping
    runtime field 的作用

2.2 runtime field优缺点

  1. runtime field是运行时增加的字段,不会被索引和存储,不会增加索引的大小。
  2. runtime field 可以像普通字段一样使用,可以进行查询,排序,聚合等操作。
  3. 可以动态的添加字段。
  4. 可以在查询时覆盖字段的值。即fields中和_source中可以返回同名的字段,但是值可能不一样。
  5. 阻止mapping爆炸,可以先使用后定义。
  6. 针对经常被搜索或聚合等操作的字段,不适合使用runtime field,而应该定义在mapping中。
  7. runtime field不会出现在_source中,需要通过fields api来获取。

3、创建runtime field的方式

3.1 通过mapping的方式创建

3.1.1、添加runtime field

PUT /index_script_fields
{
  "mappings": {
    "runtime": {
      "aggLineName": {
        "type": "keyword",
        "script": {
          "source": "emit(doc['lineName'].value)"
        }
      }
    },
    "properties": {
      "lineId": {
        "type": "keyword"
      },
      "lineName": {
        "type": "text"
      }
    }
  }
}

3.1.2、更新 runtime field

POST /index_script_fields/_mapping
{
  "runtime": {
    "aggLineName": {
      "type": "keyword",
      "script": {
        "source": "emit(doc['lineName'].value)"
      }
    }
  }
}

3.1.3、删除runtime field

POST /index_script_fields/_mapping
{
  "runtime": {
    "aggLineName": null 
  }
}

3.2 通过search request定义runtime field

GET /index_script_fields/_search
{
  "runtime_mappings": {
    "lineName": {
      "type": "keyword",
      "script": "emit(params['_source']['lineName']+'new')"
    }
  }, 
  "query": {
    "match_all": {}
  },
  "fields": [
    "lineName"
  ]
}

通过search request定义runtime field

4、需求

我们存在一个线路mapping,其中lineName在设计的使用使用了text类型,现在我们需要根据这个字段来进行聚合操作,那么使用runtime field该如何操作呢?

5、实现

5.1 mapping

PUT /index_script_fields
{
  "mappings": {
    "properties": {
      "lineId": {
        "type": "keyword"
      },
      "lineName": {
        "type": "text"
      }
    }
  }
}

注意此时的lineName的类型是text

5.2 插入数据

PUT /index_script_fields/_bulk
{"index":{"_id":1}}
{"lineId":"line-01","lineName":"线路A"}
{"index":{"_id":2}}
{"lineId":"line-01","lineName":"线路A"}
{"index":{"_id":3}}
{"lineId":"line-02","lineName":"线路C"}

5.3、根据线路来进行聚合

从上方的mapping中可以lineNametext类型,是不可进行聚合操作的,那么此时我们想进行聚合操作,就可以使用runtime field来实现。

5.3.1 不使用runtime field

不使用runtime field

5.3.2 使用runtime field

5.3.2.1 dsl

GET /index_script_fields/_search
{
  "runtime_mappings": {
    "aggLineName": {
      "type": "keyword",
      "script": "emit(params['_source']['lineName']+'new')"
    }
  }, 
  "query": {
    "match_all": {}
  },
  "fields": [
    "lineName"
  ],
  "aggs": {
    "agg_line_name": {
      "terms": {
        "field": "aggLineName",
        "size": 10
      }
    }
  }
}

5.3.2.2 java代码

@Test
@DisplayName("lineName字段是text类型,无法进行聚合操作,定义一个runtime field来进行聚合操作")
public void test01() throws IOException {
    SearchRequest request = SearchRequest.of(searchRequest ->
            searchRequest.index(INDEX_NAME)
                    // 查询所有数据
                    .query(query -> query.matchAll(matchAll -> matchAll))
                    // runtime field字段不会出现在 _source中,需要使用使用 fields api来获取
                    .fields(fields -> fields.field("lineName"))
                    // 创建一个 runtime filed 字段类型是 keyword
                    .runtimeMappings("aggLineName", runtime ->
                            runtime
                                    // 此处给字段类型为keyword
                                    .type(RuntimeFieldType.Keyword)
                                    .script(script ->
                                    script.inline(inline ->
                                            // runtime field中如果使用 painless脚本语言,需要使用emit
                                            inline.lang(ScriptLanguage.Painless)
                                                    .source("emit(params['_source']['lineName']+'new')")
                                    )
                            )
                    )
                    // 进行聚合操作
                    .aggregations("agg_line_name", agg ->
                            // 此处的 aggLineName即为上一步runtime field的字段
                            agg.terms(terms -> terms.field("aggLineName").size(10))
                    )
                    .size(100)
    );

    System.out.println("request: " + request);
    SearchResponse<Object> response = client.search(request, Object.class);
    System.out.println("response: " + response);

5.3.3.3 运行结果

聚合

6、完整代码

https://gitee.com/huan1993/spring-cloud-parent/blob/master/es/es8-api/src/main/java/com/huan/es8/runtimefield/RuntimeFieldCorrectMappingError.java

7、参考链接

1、https://www.elastic.co/guide/en/elasticsearch/reference/8.6/runtime.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLO项目资源包配置及云硬盘挂载问题

资源包配置 首先就是pytorch的安装了&#xff0c;这里可以使用conda命令或者是pip命令 首先是conda命令&#xff0c;博主在第一个服务器时的安装方式就是这个&#xff0c;很正常&#xff0c;但到第二次安装时却总是出错 conda install pytorch1.12.0 torchvision0.13.0 torch…

【6】【vue3+elementplus+springboot+mybatisplus】 管理系统 【前后端实践】

第一部分&#xff1a; elementplus官网&#xff1a;一个 Vue 3 UI 框架 | Element Plus (element-plus.org) 1、安装elementplus npm install element-plus --save查看package.json中存在依赖表示成功安装 2、引入elementplus import ElementPlus from element-plus import …

(考研湖科大教书匠计算机网络)第三章数据链路层-第六节媒体接入控制1:基本概念和静态划分信道

专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;媒体接入控制基本概念二&#xff1a;静态划分信道&#xff08;1&#xff09;信道复用和多点接入A&#xff1a;信道复用B&#xff1a;多点接入&#xff08;2&#xff09;常见信道…

pycharm设置中文,字体颜色修改,设置背景图片(图文讲解)

目录 1.设置中文 2.设置背景图片 3.字体大小&#xff0c;颜色的修改 这个是我的pycharm编译器的样子&#xff0c;好看吧&#xff01;&#xff01;&#xff01; pycharm在安装之后默认是英语的&#xff0c;有些小伙伴的英语不太会&#xff0c;看英文会比较吃力&#xff0c;这里…

【OpenGL学习】材质

材质 在图形学中&#xff0c;材质表示了光线如何和物体进行交互&#xff0c;有了解过 BRDF 的话&#xff0c;实际上 Material BRDF&#xff0c;有关材质的讲述&#xff0c;可以在这篇文章中了解&#xff1a;计算机图形学&#xff08;六&#xff09;——材质 - 知乎 (zhihu.co…

Codeforces Round #848 (Div. 2) D - Flexible String Revisit

Codeforces Round #848 (Div. 2) D - Flexible String Revisit 题意&#xff1a;给定两个题意&#xff1a;给定两个题意&#xff1a;给定两个 010101 字符串字符串字符串 aaa 和和和 bbb &#xff0c;每次操作可选择字符串每次操作可选择字符串每次操作可选择字符串 aaa 上的数…

基于rust的,gRPC动态代理,无需proto文件自动http转gRPC

目录前言grpc实践github地址第一步第二步第三步第四步测试结构和原理尾语前言 沟通服务间接口内容(尤其是前后端接口)&#xff0c;是非常让人头疼的事。极其容易扯皮。接口文档写起来也很痛苦&#xff0c;每个字段的改动都需要及时更新&#xff0c;否则就会出问题。服务端通信如…

链表(初学)

n个结点由指针链组成一个链表。链表的结点在存储器中的位置是任意的&#xff0c;即逻辑上相邻的数据元素在物理上不一定相邻。链表的每一个结点有两个区域&#xff0c;分别是数据域和指针域。数据域存储的是当前结点的数据值&#xff0c;而指针域存储的是下一个结点的存储地址。…

URL的正则表达式(js代码)

在WWW上&#xff0c;每一信息资源都有统一的且在网上的地址&#xff0c;该地址就叫URL&#xff08;Uniform Resource Locator,统一资源定位器&#xff09;&#xff0c;它是WWW的统一资源定位标志&#xff0c;就是指网络地址。语法URL由三部分组成&#xff1a;资源类型、存放资源…

2022财年业绩增长乏力渐显,AR电商是Snap下一个突破口吗?

北京时间2月1日&#xff0c;Snap公布了2022财年第四季度和全年财务业绩&#xff0c;财报发布后&#xff0c;Snap盘后股价大幅下跌&#xff0c;最终收跌14.97%。 这并非Snap首次出现公布业绩后股价暴跌的情况&#xff0c;不可否认的是市场的敏锐度十分迅捷。那么&#xff0c;20…

数据结构——栈

一、栈的定义 栈是限定仅在表尾进行插入和删除操作的线性表。 允许插入和删除的一端称为栈顶&#xff0c;另一端称为栈底&#xff0c;不含任何数据元素的栈称为空栈。栈又称为后进先出的线性表&#xff0c;简称LIFO结构。 栈的插入操作&#xff0c;叫作进栈&#xff0c;也称压栈…

不固定版式文档的OCR模型自主开发流程及技术应用实例

随着各行业数字化、智能化建设的脚步加快&#xff0c;OCR得到了普及应用。当前&#xff0c;OCR技术主要应用于标准证件、票据识别&#xff0c;通过自动检测并识别、提取文字&#xff0c;减少人工录入信息的工作量&#xff0c;提升业务效率。目前&#xff0c;企业对OCR的识别精度…

java 分布式缓存 redis持久化 redis主从 Redis哨兵 Redis分片集群

-- 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题&#xff1a; 数据丢失问题 &#xff1a;Redis是内存存储&#xff0c;服务重启可能会丢失数据 并发能力问题 &#xff1a;单节点Redis并发能力虽然不错&#xff0c;但也无法满足如618这样的高并发场景 故障…

flink学习35:flinkSQL查询mysql

总览&#xff1a; import org.apache.flink.streaming.api.scala._ import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment import org.apache.flink.table.api.EnvironmentSettings import org.apache.flink.table.api.bridge.scala.{StreamTableEnvi…

day 23 贪心

P4447 [AHOI2018初中组]分组要求分成的每个小组的队员实力值连续&#xff0c;同时&#xff0c;一个队不需要两个实力相同的选手满足所有人都恰好分到一个小组&#xff0c;使得人数最少的组人数最多&#xff0c;输出人数最少的组人数的最大值。注意&#xff1a;实力值可能是负数…

【软件测试】 MySQL数据库总结,表的一系列操作,你看的都用得到......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 MySQL中的数据类型 …

ROS小车研究笔记2/2/2023 激光雷达建图

1 启动激光雷达建图节点 roslaunch turn_on_wheeltec_robot mapping.launch 2 启动rviz使建图可视化 rviz 在rviz中如果出现小车坐标错误&#xff0c;如小车坐标倾斜&#xff0c;可以按单片机上的RESET键使里程计复位。 我在测试中还出现启动mapping.launch后持续显示无法启动…

2023牛客寒假算法基础集训营5 -- C - 小沙の不懂

题目如下&#xff1a; 题目描述 输入描述: 输入两个整数 a, b, 0≤a,b<101050 \le a, b < 10^{10^5}0≤a,b<10105 输出描述: 如果在每一种情况中 a>ba>ba>b, 则输出">“。 如果在每一种情况中 a<ba<ba<b, 则输出”<“。 如果在每一种…

KT6368A双模蓝牙芯片功能 参数 应用 等等介绍

目录 一、KT6368A蓝牙芯片的基本介绍 二、KT6368A的功能介绍 三、KT6368A应用场景介绍 四、KT6368A的扩展说明 一、KT6368A蓝牙芯片的基本介绍 先看看官网的简单介绍&#xff1a; KT6368A芯片是一款支持蓝牙双模的纯数据芯片&#xff0c;蓝牙5.1版本。芯片的亮点在超小尺…

2022年重回王座,通用汽车电气化前景几何?

北京时间1月31日&#xff0c;美国汽车巨头通用汽车发布2022财年年报&#xff0c;第四度业绩超预期。 据通用汽车财报显示&#xff0c;其2022年Q4实现营收431.08亿美元&#xff0c;市场预期为406.5亿美元&#xff0c;摊薄调整后每股收益为2.12美元&#xff0c;市场预期为1.69美…