首页 > 其他分享 >ElasticSearch 备考 -- Runtime Field

ElasticSearch 备考 -- Runtime Field

时间:2024-09-03 21:55:09浏览次数:5  
标签:runtime -- task field num ElasticSearch 100 Runtime type

一、题目

在集群上有索引 task,请编写查询并满足要求:

定义一个名为field_num 的运行时字段,实现以下聚合(a字段的值等于field_x字段减去field_y字段),field_num 聚合区间如下:

  • 聚合值小于0的文档
  • 聚合0到100之间的文档
  • 聚合大于100的文档

二、思考

1)运行时字段第一反应runtime filed,运行时字段有两种类型一个是mapping中的,一个是查询中的,通过审题好像没有限定,所以两种应该都可以。

2)聚合使用的agg,这里要求有区间所以应该是range

三、解题

索引准备工作

# DELETE task
PUT task
{
  "mappings": {
    "properties": {
      "field_x": {
        "type": "integer"
      },
      "field_y": {
        "type": "integer"
      }
    }
  }
}


PUT task/_bulk
{"create":{"_id":"1"}}
{"field_x":1,"field_y":100}
{"create":{"_id":"2"}}
{"field_x":100,"field_y":10}
{"create":{"_id":"3"}}
{"field_x":190,"field_y":10}
{"create":{"_id":"4"}}
{"field_x":33,"field_y":10}
{"create":{"_id":"5"}}
{"field_x":100,"field_y":210}

方案一:mapping 中配置runtime field

Step 1、创建mapping 指定runtime字段

注意:

  1. mappings下面 运行时字段为 runtime,不是runtime_mappings
  2. emit 方法返回值是数值类型,type为long,不能为integer
  3. 脚本中获取字段值使用doc['xx'].value
# DELETE task
PUT task
{
  "mappings": {
    "runtime": {
      "field_num": {
        "type": "long",
        "script": {
          "source": """
            emit(doc['field_x'].value - doc['field_y'].value)
          """
        }
      }
    },
    "properties": {
      "field_x": {
        "type": "integer"
      },
      "field_y": {
        "type": "integer"
      }
    }
  }
}

Step 2、创建查询语句

注意:

  1. 运行时字段不在_source下,如果需要查看字段需要将fields设置为["*"]
  2. range要通过filed指定要聚合的字段名,如果为"",不会报错,但聚合的结果值是都是0
POST task/_search
{
  "size": 0,
  "fields": [
    "*"
  ],
  "aggs": {
    "range_num": {
      "range": {
        "field": "field_num",
        "ranges": [
          {
            "to": 0
          },
          {
            "from": 0,
            "to": 100
          },
          {
            "from": 100
          }
        ]
      }
    }
  }
}

方案二:在查询语句中使用runtime field

注意:

  1. query 下面运行时字段为 runtime_mappings,要和mapping下的 runtime 区别开
  2. emit 方法返回值是数值类型,type为long,不能为integer
  3. 脚本中获取字段值使用doc['xx'].value
POST task/_search
{
  "size": 0,
  "fields": [
    "*"
  ],
  "runtime_mappings": {
    "field_num": {
      "type": "long",
      "script": {
        "source": """
            emit(doc['field_x'].value - doc['field_y'].value)
          """
      }
    }
  },
  "aggs": {
    "range_num": {
      "range": {
        "field": "field_num",
        "ranges": [
          {
            "to": 0
          },
          {
            "from": 0,
            "to": 100
          },
          {
            "from": 100
          }
        ]
      }
    }
  }
}

四、总结

1、runtime filed主要由两种形式,注意相应格式mapping中的为runtime,query中的runtime_mappings

2、在实际工程使用中不建议使用runtime_filed,因为会影响查询性能,建议预先将逻辑处理好写入索引字段,然后直接查询

参考资料

送一波福利:

标签:runtime,--,task,field,num,ElasticSearch,100,Runtime,type
From: https://blog.csdn.net/hengzhepa/article/details/141791423

相关文章

  • P01-Java何谓数组
    P01-Java何谓数组一、数组声明创建1.1数组声明的语法与c++有所不同在Java中,数组声明语法首选语法://数据类型[]数组名称;int[]arr;次选,与c++类似//数据类型数组名称[];intarr[];1.2数组创建语法与c++指针有所相似,在java中用new创建数组//数组名称=......
  • Java中的接口
    接口在Java编程中,接口和抽象类是用于定义类行为的两种不同机制。接口是一种行为规范,用来规定类应该遵循的行为和方法,而抽象类则是对行为的抽象,相当于一种模板设计。在本文中,我们将深入探讨接口的特点、使用场景以及在实际编程中的应用。什么是接口接口(Interface)在Java中是一......
  • Linux C++ 开发7 - GDB常用命令汇总(你想了解的都在这)
    1.运行命令2.设置断点3.查看源码4.打印表达式5.查看运行信息5.1.设置和查看运行参数的Demo6.分割窗口7.参考文档上一篇《LinuxC++开发6-GDB调试》中我们讲解了GDB的调试流程和常用的调试方法。GDB的调试指令众多,我们这里针对常用的指令做一个汇总(按功能......
  • C语言典型例题60
    《C程序设计教程(第四版)——谭浩强》习题4.1统计全单位人员的平均工资。单位的人数是不固定的,工资数从键盘先后输入,当输入-1时,表示输入结束(前面输入的都是有效数字)。代码://《C程序设计教程(第四版)——谭浩强》//习题4.1统计全单位人员的平均工资。单位的人数是不固定......
  • 代码随想录day16--图论
    题目描述:给定一个由1(陆地)和0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。输入描述:第一行包含两个整数N,M,表示矩阵的行数和列数。后续N行,每行包含M个数字,数字为1或者0。输出描......
  • Hadoop 第七周总结
    Hadoop第七周总结在第七周的学习中,我深入探讨了Hadoop生态系统中的几个关键组成部分,重点包括HadoopMapReduce、HDFS(HadoopDistributedFileSystem)、YARN(YetAnotherResourceNegotiator),以及Hadoop的调优策略。以下是本周学习的主要内容和总结:1.HadoopMapReduceMapReduce......
  • 大二必做项目贪吃蛇超详解之下篇游戏核心逻辑实现
    贪吃蛇系列文章上篇win32库介绍中篇设计与分析下篇游戏主逻辑可以在Gitee上获取贪吃蛇代码。文章目录贪吃蛇系列文章5.核心逻辑实现分析5.3GameRun5.3.1PrintScore5.3.2CheckVK5.3.3BuyNewNode5.3.4NextIsFood5.3.4EatFood5.3.5NotFood5.3.6C......
  • 日志技术
    概述把程序运行的信息记录到文件中,方便程序员定位Bug,并了解程序的执行情况。把系统执行的信息,方便的记录的指定的位置(控制台、文件、数据库)。可以随时以开关的形式控制日志的启停,无需侵入到源代码中进行修改。日志框架(1)配置文件,将下面三个jar包导入到库(2)将Logback框架的核心文件log......
  • 【问题记录】【数据库】库存或者账户流水记录修复
    1 前言大家的系统有没有关于客户资金、会员卡余额、库存记录等,这些相关信息的存储,说白了就是流水记录表。不知道大家是如何存储的,我们的存储一条记录最起码的是变动数量、变动前数量、变动后数量,这个变动前、变动后就粘的比较紧,那么当系统出现问题的时候,可能中间差一条变动,那么......
  • ElasticSearch 备考 -- Nested
    一、题目存在索引phones,其中存在两条数据如下PUTphones/_doc/1{  "brand":"Samsumg",  "model":"GalaxyS9+",  "features":[    {      "type":"os",      "value":&......