ElasticSearch 备考 -- Runtime Field

一、题目

在集群上有索引 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,因为会影响查询性能,建议预先将逻辑处理好写入索引字段,然后直接查询

参考资料

送一波福利:

  • 25
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch X-Pack 是一个强大的插件,它为 Elasticsearch 提供了一系列的扩展功能,包括安全、监控、报告、机器学习等。下面简单介绍一下如何安装 Elasticsearch X-Pack。 1. 下载 Elasticsearch X-Pack 插件 你可以从 Elastic 官网下载对应版本的 X-Pack 插件,链接为:https://www.elastic.co/cn/downloads/x-pack。 2. 安装 Elasticsearch X-Pack 插件 安装 Elasticsearch X-Pack 插件需要使用 Elasticsearch 的插件安装命令。将下载好的 X-Pack 插件解压到 Elasticsearch 的 plugins 目录下,然后使用以下命令安装插件: ``` bin/elasticsearch-plugin install file:///path/to/x-pack-xxx.zip ``` 其中,`/path/to/x-pack-xxx.zip` 是 X-Pack 插件的压缩包路径。 3. 配置 Elasticsearch X-Pack 插件 安装 Elasticsearch X-Pack 插件后,你需要在 Elasticsearch 的配置文件中进行相应的配置。具体配置方法可以参考官方文档。 4. 启动 Elasticsearch X-Pack 插件 启动 Elasticsearch X-Pack 插件需要先启动 Elasticsearch,然后在 Elasticsearch 的命令行界面输入以下命令: ``` bin/elasticsearch ``` 如果一切顺利,你应该可以看到 Elasticsearch 启动成功的日志信息。 5. 验证 Elasticsearch X-Pack 插件是否安装成功 你可以通过访问 Elasticsearch 的 API 或者使用 Kibana 来验证 Elasticsearch X-Pack 插件是否安装成功。如果安装成功,你应该可以看到 X-Pack 相关的 API 和功能。 总之,在安装 Elasticsearch X-Pack 插件之前,你需要先了解自己的 Elasticsearch 版本,然后下载对应版本的 X-Pack 插件。安装插件需要使用 Elasticsearch 的插件安装命令,并且需要在 Elasticsearch 的配置文件中进行相应的配置。启动插件后,你可以通过访问 Elasticsearch 的 API 或者使用 Kibana 来验证插件是否安装成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值