文章目录

  • 1. Painless 简介
    • Painless 的用途
  • 2. 参数
  • 3. 首选参数
  • 4. 简短脚本形式
  • 5. 通过 Painless 脚本访问字段
  • 6. 示例
    • 6.1 案例 1:Script Processsor
    • 6.2 案例 2:文档更新计数
    • 6.3 案例 3:搜索时的 Script 字段
    • 6.4 Script :Inline v.s Stored
    • 6.5 示例4
  • 3. 缓存

1. Painless 简介

自 ES 5.x 后引入,专门为 ES 设置,扩展了 Java 的语法
6.0 开始,ES 只支持 Painless。Grooby ,JavaScript 和 Python 都不在支持
Painless 支持所有的 Java 的数据类型及 Java API 子集
Painless Script 具备以下特性

  • 高性能 、 安全
  • 支持显示类型或者动态定义类型

Painless 的用途

Painless 可以对文档字段进行加工处理

  • 更新或者删除字段,处理数据聚合操作
  • Script Field: 对返回的字段提前进行计算
  • Function Score:对文档的算分进行处理

在 Ingest Pipeline 中执行脚本
在 Reindex API,Update By Query 时,对数据进行处理

  • 脚本编写的语言,默认为painless。
  • 脚本本身可以指定为内联脚本的source或存储脚本的id。
  • 应传递给脚本的任何命名参数。

2. 参数

lang

  • 指定编写脚本的语言,默认为painless。

source,id

  • 指定脚本的来源,inline脚本是指定source,,存储的脚本是指定的id,并从群集状态中检索(请参阅存储的脚本)。

params

  • 指定作为变量传递到脚本的任何命名参数。

3. 首选参数

Elasticsearch第一次看到一个新脚本,它会编译它并将编译后的版本存储在缓存中,编译可能是一个繁重的过程。

如果需要将变量传递给脚本,则应将它们作为命名参数传递给脚本本身而不是硬编码值,例如,如果你希望能够将字段值乘以不同的乘数,请不要将乘数硬编码到脚本中:

"source": "doc['my_field'] * 2"

相反,将其作为命名参数传递:

  "source": "doc['my_field'] * multiplier","params": {"multiplier": 2}

第一个版本每次乘数改变时都必须重新编译,第二个版本只编译一次。

如果你在很短的时间内编译了太多独特的脚本,Elasticsearch将使用circuit_breaking_exception错误拒绝新的动态脚本。默认情况下,每分钟将编译最多15个内联脚本,你可以通过设置script.max_compilations_rate动态更改此设置。

4. 简短脚本形式

可以使用简短脚本形式来简化,在简短形式中,script由字符串而不是对象表示,该字符串包含脚本的源。

简写:

"script": "ctx._source.likes++"

正常形式的相同脚本:

  "script": {"source": "ctx._source.likes++"}

5. 通过 Painless 脚本访问字段

上下文 语法
Ingestion ctx.field_name
Update ctx._source.field_name
Search & Aggregation doc[“field_name”]

6. 示例

6.1 案例 1:Script Processsor

# 增加一个 Script Prcessor
POST _ingest/pipeline/_simulate
{"pipeline": {"description": "to split blog tags","processors": [{"split": {"field": "tags","separator": ","}},{"script": {"source": """if(ctx.containsKey("content")){ctx.content_length = ctx.content.length();}else{ctx.content_length=0;}"""}},{"set": {"field": "views","value": 0}}]},"docs": [{"_index": "index","_id": "id","_source": {"title": "Introducing big data......","tags": "hadoop,elasticsearch,spark","content": "You konw, for big data"}},{"_index": "index","_id": "idxx","_source": {"title": "Introducing cloud computering","tags": "openstack,k8s","content": "You konw, for cloud"}}]
}

6.2 案例 2:文档更新计数

DELETE tech_blogs
PUT tech_blogs/_doc/1
{"title":"Introducing big data......","tags":"hadoop,elasticsearch,spark","content":"You konw, for big data","views":0
}POST tech_blogs/_update/1
{"script": {"source": "ctx._source.views += params.new_views","params": {"new_views":100}}
}# 查看views计数
POST tech_blogs/_search

6.3 案例 3:搜索时的 Script 字段

GET tech_blogs/_search
{"script_fields": {"rnd_views": {"script": {"lang": "painless","source": """java.util.Random rnd = new Random();doc['views'].value+rnd.nextInt(1000);"""}}},"query": {"match_all": {}}
}

6.4 Script :Inline v.s Stored

#保存脚本在 Cluster State
POST _scripts/update_views
{"script":{"lang": "painless","source": "ctx._source.views += params.new_views"}
}POST tech_blogs/_update/1
{"script": {"id": "update_views","params": {"new_views":1000}}
}

6.5 示例4

首先,在集群状态下创建名为calculate-score的脚本:

POST _scripts/calculate-score
{"script": {"lang": "painless","source": "Math.log(_score * 2) + params.my_modifier"}
}

可以使用以下命令检索相同的脚本:

GET _scripts/calculate-score

可以通过指定id参数来使用存储的脚本,如下所示:

GET _search
{"query": {"script": {"script": {"id": "calculate-score","params": {"my_modifier": 2}}}}
}

删除:

DELETE _scripts/calculate-score

3. 缓存

编译的开销相较大
Elasticsearch 会将脚本编译后缓存在 Cache 中

  • Inline scripts 和 Stored Scripts 都会被缓存
  • 默认缓存 100 个脚本

Elasticsearch Painless Script详解相关推荐

  1. php操作ElasticSearch搜索引擎流程详解

    更多python.php教程请到友情连接: 菜鸟教程https://www.piaodoo.com 茂名一技http://www.enechn.com ppt制作教程步骤 http://www.tpy ...

  2. Elasticsearch之Template详解

    Elasticsearch之Template详解 一.Index Template 示例1 示例2 示例3 二.Dynamic Template 示例1 在ES中我们可以通过设置 Index Temp ...

  3. Elasticsearch的原理详解和使用

    目录 一.Elasticsearch 介绍 1.1 简介 1.2 原理和应用 1.2.1 先了解一下Lucene的整体框架 1.2.2 ES核心概念 1.2.3 ES实现写入和读取的原理 二.Elas ...

  4. elasticsearch Routing 路由详解

    前言 当索引一个文档的时候,文档会被存储到一个主分片中.那么,elasticsearch如何知道一个文档应该存放到哪个分片中呢? 首先这肯定不是随机的,否则在检索文档时就不知道该从哪去寻找它了.实际上 ...

  5. Elasticsearch 分词器详解(热更新词库)

    1 分词器 text类型数据存入ES经过的步骤: 2 规范化(normalization) #采用默认分词器分词 GET _analyze {"analyzer": "s ...

  6. Elasticsearch之配置详解

    Cluster 集群名称,默认为elasticsearch:  cluster.name: elasticsearch 设置一个节点的并发数量,有两种情况,一种是在初始复苏过程中:  cluster. ...

  7. gradle中的build script详解

    文章目录 简介 project和task 一个例子 task详细讲解 task脚本 task依赖 动态task 默认task build script的外部依赖 简介 build.gradle是gra ...

  8. Elasticsearch聚合深入详解——对比Mysql实现

    聚合认知前提 桶(Buckets)--满足特定条件的文档的集合  指标(Metrics)--对桶内的文档进行统计计算 SELECT COUNT(color)  FROM table  GROUP BY ...

  9. Elasticsearch检索分类详解

    Elasticsearch中当我们设置Mapping(分词器.字段类型)完毕后,就可以按照设定的方式导入数据. 有了数据后,我们就需要对数据进行检索操作.根据实际开发需要,往往我们需要支持包含但不限于 ...

最新文章

  1. 华为虚拟home键关闭_苹果iPhone12或放弃静音键,学华为mate30Pro,发力虚拟按键
  2. Android 重新编译资源文件
  3. opencv 人脸识别_人工智能-OpenCV+Python实现人脸识别(视频人脸检测)
  4. pmp每日三题(2022年2月23日)
  5. 腾讯云大数据套件Hermes-MR索引插件使用总结
  6. SAP Cloud for Customer interaction center 呼叫中心集成
  7. container 的背后
  8. IDEA项目搭建四——使用Mybatis实现Dao层
  9. 2018年4月工业用微型计算机,2018年自考工业用微型计算机押密试题及答案(六)...
  10. python任务调度系统web_监听调度系统定时执行任务python_websock
  11. Hadoop实战(3)_虚拟机搭建CDH的全分布模式
  12. 作为前端Web开发者,这12条基本命令不可不会
  13. 保存最大的前20项暴力--Heritage of skywalkert
  14. Nexus3 功能介绍
  15. 详解拉东(Radon)变换原理、直线检测、代码实现
  16. Typora给插图加入图注
  17. Androidg 改变CheckBox下的选中与未选中图片
  18. 初识人工智能AI(基本概念)
  19. java的包资源管理器怎么弄出来_eclipse包资源管理器java项目,包,类重命名 来学习吧...
  20. MY-I.MX6-DEMO Android4.4.2环境搭建

热门文章

  1. javascript 校验 非空_Javascript的表单与验证-非空验证
  2. 查看地区的ip段_「教程」CloudFlare 自选 IP优化网站速度
  3. python的特点及应用-python有什么特性和劣势?老男孩python入门
  4. 程序发出的广播其他程序收不到_RabbitMQ 如何实现对同一个应用的多个节点进行广播...
  5. python定时任务apschedule_APScheduler(python 定时任务框架)最简单使用教程
  6. 基础学习——C语言递归解决分鱼问题
  7. php链接本地mysql数据库配置文件_php连接 mysql 数据库如何添加一个公共的配置文件...
  8. oracle flashback 深入研究,oracle 之flashback 深入研究。
  9. babylonjs 设置面板位置_一篇关于开关面板的详细集合,值得收藏转发
  10. linux 配置trac界面显示为中文,安装back|track 5 r3并配置中文界面简单教程