目录

1、背景

此篇文档仅仅是简单的记录一下painless的一些简单的例子,防止以后忘记,不过多涉及painless的语法。

2、准备数据

2.1 mapping

PUT /index_person
{
"mappings": {
"properties": {
"name": {
"type": "keyword"
},
"age": {
"type": "integer"
},
"province": {
"type": "keyword"
}
}
}
}

2.2 插入数据

PUT /index_person/_bulk
{"index":{"_id":1}}
{"name":"张三","age":20,"province":"湖北"}
{"index":{"_id":2}}
{"name":"李四","age":25,"province":"北京"}
{"index":{"_id":3}}
{"name":"王五","age":30,"province":"湖南"}

3、例子

3.1 (update)更新文档 id=1 的文档,将 age 加 2岁

POST index_person/_update/1
{
"script": {
"lang": "painless",
"source": """
ctx['_source']['age'] += params['incrAge']
""",
"params": {
"incrAge": 2
}
}
}

3.2 (update_by_query)如果 province 是北京的话,就将 age 减少1岁

POST index_person/_update_by_query
{
"query": {
"term": {
"province": {
"value": "北京"
}
}
},
"script": {
"lang": "painless",
"source": """
ctx['_source']['age'] -= params['decrAge']
""",
"params": {
"decrAge": 1
}
}
}

3.3 (ctx.op)如果张三的年龄小于20岁就不处理,否则就删除这个文档

POST index_person/_update/1
{
"script": {
"lang": "painless",
"source": """
// 这是默认值,表示的是更新值,重新索引记录
ctx.op = 'index';
if(ctx._source.age < 20){
// 表示不处理
ctx.op = 'none';
}else{
// 表示删除这个文档
ctx.op = 'delete';
}
"""
}
}

3.4 (stored script)如果是湖南省则增加地市字段,值为长沙

3.4.1 创建存储脚本

PUT _scripts/add_city
{
"script":{
"lang": "painless",
"source": "ctx._source.city = params.city"
}
}

add_city为脚本的id

3.4.2 使用存储脚本

POST index_person/_update_by_query
{
"query": {
"term": {
"province": {
"value": "湖南"
}
}
},
"script": {
"id": "add_city",
"params": {
"city": "长沙"
}
}
}

3.5 (pipeline)通过pipeline如果插入的文档的age<10则放入到index_person_small索引中

3.5.1 创建pipeline

PUT _ingest/pipeline/pipeline_index_person_small
{
"description": "如果插入的文档的age<10则放入到index_person_small索引中",
"processors": [
{
"script": {
"source": """
if(ctx.age < 10){
ctx._index = 'index_person_small';
}
"""
}
}
]
}

3.5.2 使用pipeline

PUT index_person/_doc/4?pipeline=pipeline_index_person_small
{
"name":"赵六",
"age": 8,
"province":"四川"
}

3.5.3 运行结果

3.6 function_score中使用script_score算分

3.6.1 需求

如果这个用户是湖南的,则使用 age作为分数

3.6.2 dsl

GET index_person/_search
{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"functions": [
{
"script_score": { "script": """
if(doc.province.value == 0){
return 0;
} if(doc.province.value == '湖南'){
return doc.age.value;
}
return 0;
"""
}
}
],
"boost_mode": "sum",
"score_mode": "sum"
}
}
}

3.6.3 运行结果

3.7 script_fields 增加字段

GET index_person/_search
{
"query": {"match_all": {}},
"fields": [
"double_age"
],
"script_fields": {
"double_age": {
"script": {
"lang": "painless",
"source": "doc.age.value * 2"
}
}
}
}

3.8 runtime field 增加字段

3.8.1 需求

针对age<25的文档,返回double_age字段,否则不处理。

3.8.2 dsl

GET index_person/_search
{
"query": {
"match_all": {}
},
"fields": [
"double_age"
],
"runtime_mappings": {
"double_age":{
"type": "keyword",
"script": """
if(doc.age.size() == 0){
return;
}
if(doc.age.value < 25){
emit(doc.age.value * 2 + '');
}
"""
}
}
}

在runtime field 中,需要使用emit来返回数据,但是不是emit(null)

3.9 _reindex 中使用

3.9.1 dsl

POST _reindex
{
"source": {
"index": "index_person"
},
"dest": {
"index": "index_person_new"
},
"script": {
"lang": "painless",
"source": """
if(ctx._source.age < 25){
ctx._source.tag = '年轻人';
}else{
ctx._source.tag = '中年人';
}
"""
}
}

3.9.2 运行结果

3.10 script query 查询age<25

GET index_person/_search
{
"query": {
"script": {
"script": {
"lang": "painless",
"source": """
if(doc.age.size() == 0){
return false;
}
return doc.age.value < 25;
"""
}
}
}
}

3.11 script 聚合

GET index_person/_search
{
"size": 0,
"aggs": {
"agg_province": {
"terms": {
"script": {
"lang": "painless",
"source": """
return doc.province
"""
},
"size": 10
}
},
"agg_age":{
"avg": {
"script": "params._source.age"
}
}
}
}

4、painless脚本调试



可以通过Debug.explain来进行一些简单的调试。

5、脚本中的doc[..]和params._source[..]

doc[..]:使用doc关键字,将导致该字段的术语被加载到内存(缓存),这将导致更快的执行,但更多的内存消耗。此外,doc[…]表示法只允许简单的值字段(您不能从中返回json对象),并且仅对非分析或基于单个术语的字段有意义。然而,如果可能的话,使用doc仍然是访问文档值的推荐方法。

params[_source][..]: 每次使用_source都必须加载和解析, 因此使用_source会相对而言要慢点。

6、painless脚本中的上下文



详细了解,请参考这个文档https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-contexts.html

elasticsearch使用painless的一些简单例子的更多相关文章

  1. Hibernate4.2.4入门(一)——环境搭建和简单例子

    一.前言 发下牢骚,这段时间要做项目,又要学框架,搞得都没时间写笔记,但是觉得这知识学过还是要记录下.进入主题了 1.1.Hibernate简介 什么是Hibernate?Hibernate有什么用? ...

  2. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  3. spring mvc(注解)上传文件的简单例子

    spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...

  4. ko 简单例子

    Knockout是在下面三个核心功能是建立起来的: 监控属性(Observables)和依赖跟踪(Dependency tracking) 声明式绑定(Declarative bindings) 模板 ...

  5. mysql定时任务简单例子

    mysql定时任务简单例子 ? 1 2 3 4 5 6 7 8 9     如果要每30秒执行以下语句:   [sql] update userinfo set endtime = now() WHE ...

  6. java socket编程开发简单例子 与 nio非阻塞通道

    基本socket编程 1.以下只是简单例子,没有用多线程处理,只能一发一收(由于scan.nextLine()线程会进入等待状态),使用时可以根据具体项目功能进行优化处理 2.以下代码使用了1.8新特 ...

  7. 一个简单例子:贫血模型or领域模型

    转:一个简单例子:贫血模型or领域模型 贫血模型 我们首先用贫血模型来实现.所谓贫血模型就是模型对象之间存在完整的关联(可能存在多余的关联),但是对象除了get和set方外外几乎就没有其它的方法,整个 ...

  8. [转] 3个学习Socket编程的简单例子:TCP Server/Client, Select

    以前都是采用ACE的编写网络应用,最近由于工作需要,需要直接只用socket接口编写CS的代码,重新学习这方面的知识,给出自己所用到的3个简单例子,都是拷贝别人的程序.如果你能完全理解这3个例子,估计 ...

  9. jsonp的简单例子

    jsonp的简单例子 index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8&q ...

  10. Java-马士兵设计模式学习笔记-观察者模式-AWT简单例子

    1.AWT简单例子 TestFrame.java import java.awt.Button; import java.awt.Frame; import java.awt.event.Action ...

随机推荐

  1. mysql 外键索引入门介绍,为什么工作中很少有人使用?

    背景 以前工作学习中,一直被告诫不要使用外键,所以也没有仔细整理过. 这里记录一下笔记. 外键 是什么? MySQL 的外键(Foreign Key)是一种关系型数据库中用于建立表与表之间关联关系的重 ...

  2. Ubuntu20.04安装记录

    在Ubuntu下将iso文件刻录到U盘, 可以使用系统自带的Startup Disk Creator. 分区方式 使用整个硬盘, 一个512G SSD, 使用默认的分区方式, 会创建一个512M的EF ...

  3. aspell命令

    aspell命令 aspell命令是一个交互式拼写检查器,其会扫描指定的文件或任何标准输入的文件,检查拼写错误,并允许交互式地纠正单词. 语法 aspell [options] command 参数 ...

  4. 微信小程序获取本日、本周、本月、本年时间段

    原文链接 https://cslaoxu.vip/110.html 说明 最近需要用到统计不同时间段内的记录数,所以找了一下现成的工具类.下面就演示一下如何引用到实际项目中. 详细用法请参考:http ...

  5. win32 - 使用Desktop Duplication API复制桌面图像

    该代码来源于codeproject,经过测试发现,在屏幕处于旋转的情况下捕获的图像是黑色的.暂时没有找到原因. 代码开箱即用, #define WIN32_LEAN_AND_MEAN #include ...

  6. leetcode 将有序数组转换为二叉搜索树

    给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树. 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树. 示例 ...

  7. ECMA Script Module(ES module)知识点

    1.每个 ES Module 都是运行在单独的私有作用,ESM 自动采用严格模式,忽略use strict <script type="module">console. ...

  8. NodeJS开启GZIP功能

    gzip是用于压缩,效果特别好,js.css等文件的压缩率一般高达70% 具体方法如下: 先安装一个依赖 npm install compression --save 然后在已有代码里(一般是app. ...

  9. 【Azure 事件中心】China Azure上是否有Kafka服务简答

    问题描述 China Azure 上是否有Kakfa服务可以使用呢? 问题回答 China Azure并没有专门的Kafka服务,但是可以使用Azure Event Hub. 创建标准版及以上的Eve ...

  10. 「实操」适配 NebulaGraph 新版本与压测实践

    本文来自邦盛科技-知识图谱团队-繁凡,本文以 NebulaGraph v3.1.0 为例. 前言 NebulaGraph v3.1 版本已经发布有一段时间了,但是我们的项目之前是基于 v2.6.1 版 ...