草庐IT

Elasticsearch学习--script

CelineT 2024-03-28 原文

一、概念

 es1.4-5.0,默认脚本语言是Grovvy

es5.0+,默认脚本语言是painless

 二、简单使用

将price减一

# 将id=1的price减一
POST goods/_update/1
{
  "script": {
    "source": "ctx._source.price -= 1"
  }
}

# 简写
POST goods/_update/1
{
  "script": "ctx._source.price -= 1"
}

其中,ctx是一个上下文对象 ,用在对数据的修改上

三、CRUD

1、数据备份

(数据来源可以查看:CSDN

#将goods中的数据备份到goods2中
POST _reindex
{
  "source": {
    "index": "goods"
  },
  "dest": {
    "index": "goods2"
  }
}

2. 新增数组中的值

# 将id=1的tags新增一个值
POST goods/_update/1
{
  "script": "ctx._source.tags.add('无线充电')"
}

3. 根据id删除

# 删除id=11的数据
POST goods/_update/11
{
  "script": "ctx.op='delete'"
}

 4. upsert

如果数据存在执行script中的内存,如果数据不存在,执行upsert中内存

POST goods/_update/15
{
  "script": {
    "source": "ctx._source.price += 100"
  },
  "upsert": {
    "name":"香蕉",
    "price": 599
  }
}

第一次执行结果

 第二次执行结果

 5. 查询

使用expression和painless两种语言进行查询,查询结果相同

GET goods/_search
{
  "script_fields": {
    "new_price": {
      "script": {
        "lang": "expression",
        "source": "doc['price'].value * 0.9"
      }
    }
  }
}

GET goods/_search
{
  "script_fields": {
    "new_price": {
      "script": {
        "lang": "painless",
        "source": "doc['price'] * 0.9"
      }
    }
  }
}

painless,doc['age'].value和doc['age']都能正确输出,但是doc['age'] * 0.9报错
expression,doc['age'].value和doc['age']都能正确输出,doc['age'] * 0.9和doc['age'].value * 0.9也都不报错

但是,painless,如果字段为空,*0.9会报错

expression:只能访问数字、布尔值、日期等,存储的字段不可用

es源数据是map类型的,在取值的时候,要根据doc['xxx']取值

update用ctx,查询的时候用doc

6. 参数化查询

给interest加一个值aaa

POST indexname/_update/2
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.interest.add('aaa')"
  }
}

es在首次执行脚本的时候,会对执行的脚本进行编译,并且把编译的结果放在缓冲区内。es的缓冲区默认只有100M,编译操作很消耗性能,es每分钟支持的编译次数是15次
解决方案是:

POST indexname/_update/2
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.interest.add(params.inserest_name)",
    "params": {
      "inserest_name":"bbb"
    }
  }
}

这样,参数是动态传递的,没有硬编码,下次参数内容发生改变,但是脚本没有发生改变,不需要重新编译,节省性能

同理,也可以这样

GET indexname/_search
{
  "script_fields": {
    "new_age": {
      "script": {
        "lang": "painless",
        "source":"doc['age'].value * params.num",
        "params": {
          "num": 0.9
        }
      }
    }
  }
}

如果是expression,就要把params.num改成num

GET indexname/_search
{
  "script_fields": {
    "new_age": {
      "script": {
        "lang": "expression",
        "source":"doc['age'].value * num",
        "params": {
          "num": 0.9
        }
      }
    }
  }
}

结果数组

GET indexname/_search
{
  "script_fields": {
    "age": {
      "script": {
        "lang": "painless",
        "source":"doc['age'].value"
      }
    },
    "new_age": {
      "script": {
        "lang": "painless",
        "source":"[doc['age'].value - params.num_1,doc['age'].value - params.num_2,doc['age'].value - params.num_3]",
        "params": {
          "num_1": 1,
          "num_2": 2,
          "num_3": 3
        }
      }
    }
  }
}

四、stored scripts:scripts模板

1. 操作脚本

因为脚本编译比较消耗性能,可以把脚本保存在集群的缓存中

语法

/_scripts/{script_id}

创建脚本

POST _scripts/age_num
{
  "script":{
     "lang": "painless",
     "source":"doc['age'].value - params.num"
  }
}

查看脚本

GET _scripts/age_num

使用脚本

GET indexname/_search
{
  "script_fields": {
    "age": {
      "script": {
        "lang": "painless",
        "source":"doc['age'].value"
      }
    },
    "new_age": {
      "script": {
        "id": "age_num",
        "params": {
          "num": 0.9
        }
      }
    }
  }
}

2. scripting的函数式编程

在source中加""",三个双引号

POST indexname/_update/2
{
  "script": {
    "lang": "painless",
    "source": """
       ctx._source.interest.add(params.inserest_name);
       ctx._source.age-=1;
    """,
    "params": {
      "inserest_name": "bbb"
    }
  }
}

如果name中包含aa:name+bb;否则,不操作。==~是匹配的意思

POST indexname/_update/2
{
  "script": {
    "lang": "painless",
    "source": """
      if(ctx._source.name ==~ /[\s\S]*aa[\s\S]*/){
        ctx._source.name+="bb"
      }else{
        ctx.op="noop"
      }
    """
  }
}

for循环取insterst的总数

GET indexname/_search
{
  "aggs": {
    "agg_insterst": {
      "sum": {
        "script": {
          "lang": "painless",
          "source": """
            int total=0;
            for(int i=0; i<doc['interest.keyword'].length;i++){
              total++;
            }
            return total;
          """
        }
      }
    }
  }
}

doc['filed']:会被加载到内存中,效率更高,更消耗内存,只允许简单类型,object和nested属于复杂类型。推荐
params['_source']['field']:每次都要重新加载,重新解析,可以用于复杂类型
 

有关Elasticsearch学习--script的更多相关文章

  1. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  2. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  3. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  4. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  5. ruby-on-rails - bundler : not executable: script/delayed_job - 2

    我正在尝试在我的远程服务器上运行以下命令(通过capistrano或ssh):bundleexecRAILS_ENV=productionscript/delayed_jobstart但我收到此错误消息:bundler:notexecutable:script/delayed_job以前从未见过这个,谷歌也没有适合我的东西。知道可能是什么问题吗? 最佳答案 也许它没有运行权限?尝试运行这个命令chmod+xscript/delayed_job然后再次执行文件。 关于ruby-on-rai

  6. ruby - 混帐 & ruby : How can I unset the GIT_DIR variable from inside a ruby script? - 2

    我编写了一个非常简单的“部署”脚本,作为我的裸git存储库中的post-updateHook运行。变量如下livedomain=~/mydomain.comstagingdomain=~/stage.mydomain.comgitrepolocation=~/git.mydomain.com/thisrepo.git(bare)core=~/git.mydomain.com/thisrepo.gitcore==addedremoteintoeachlive&stagegitslive和stage都初始化了gitrepos(非裸),我已经将我的裸仓库作为远程添加到它们中的每一个(名为co

  7. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

  8. ruby-on-rails - 在任何来源中都找不到 coffee-script-source-1.1.3 - 2

    您好,我正在做Rails应用程序,当我捆绑安装时它返回一个错误:无法在任何来源中找到coffee-script-source-1.1.3我知道coffee-script-source-1.1.3gem已被弃用/取消,但我的其他gem与此有依赖关系。但是这个项目正在与其他机器和heroku产品一起工作。如何在不更改我的gemfile的情况下成功捆绑安装?谢谢 最佳答案 运行这个:bundleupdate--sourcecoffee-script-source如果出现错误,如下所示:Anerroroccurredwhileinstall

  9. ruby - Rails Elasticsearch 聚合 - 2

    不知何故,我似乎无法获得包含我的聚合的响应...使用curl它按预期工作:HBZUMB01$curl-XPOST"http://localhost:9200/contents/_search"-d'{"size":0,"aggs":{"sport_count":{"value_count":{"field":"dwid"}}}}'我收到回复:{"took":4,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":90,"max_score":0.0,"hits":[]},"a

  10. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

随机推荐