首页 > 其他分享 >elasticsearch脚本查询

elasticsearch脚本查询

时间:2023-05-14 17:13:44浏览次数:52  
标签:脚本 脚本语言 doc painless 查询 source elasticsearch ES

脚本查询

  1. 概念

    Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强大的脚本功能,ES支持多种脚本语言,如painless,其语法类似于Java,也有注释、关键字、类型、变量、函数等,其就要相对于其他脚本高出几倍的性能,并且安全可靠,可以用于内联和存储脚本。

  2. 支持的语言

    1. groovy:ES 1.4.x-5.0的默认脚本语言

    2. painless:JavaEE使用java语言开发,.Net使用C#/F#语言开发,Flutter使用Dart语言开发,同样,ES 5.0+版本后的Scripting使用的语言默认就是painless,painless是一种专门用于Elasticsearch的简单,用于内联和存储脚本,是ES 5.0+的默认脚本语言,类似于Java,也有注释、关键字、类型、变量、函数等,是一种安全的脚本语言。并且是Elasticsearch的默认脚本语言。

    3. 其他

      expression:每个文档的开销较低:表达式的作用更多,可以非常快速地执行,甚至比编写native脚本还要快,支持javascript语法的子集:单个表达式。缺点:只能访问数字,布尔值,日期和geo_point字段,存储的字段不可用

      mustache:提供模板参数化查询

  3. 特点

    1. 语法简单,学习成本低
    2. 灵活度高,可编程能力强
    3. 性能相较于其他脚本语言很高
    4. 安全性好
    5. 独立语言,虽然易学但仍需单独学习
    6. 相较于DSL性能低
    7. 不适用于复杂的业务场景
  4. 应用场景:各种复杂的应用场景,如自定义评分、自定义聚合查询等。

  5. 正则:

    早先某些版本正则表达式默认情况下处于禁用模式,因为它绕过了painless的针对长时间运行和占用内存脚本的保护机制。而且有深度对战行为。如果需要开启正则,需要配置:script.painless.regex.enabled: true

    注意:通常正则的使用范围比较小,应用范围基本限制在数据量比较小和并发量比较小的应用场景下。

  6. doc['field'].value和params['_source']['field']:

    理解之间的区别是很重要的,doc['field'].value和params['_source']['field']。首先,使用doc关键字,将导致该字段的条件被加载到内存(缓存),这将导致更快的执行,但更多的内存消耗。此外,doc[...]符号只允许简单类型(不能返回一个复杂类型(JSON对象或者nested类型)),只有在非分析或单个词条的基础上有意义。但是,doc如果可能,使用仍然是从文档访问值的推荐方式,因为_source每次使用时都必须加载并解析。使用_source非常缓慢

 

# ES脚本
##语法:ctx._source.<field-name>
GET product/_search
GET product/_doc/2
POST product/_update/2
{
  "script": {
    "source": "ctx._source.price-=1"
  }
}

POST product/_update/2
{
  "script": {
    "source": "ctx._source.price-=ctx._version"
  }
}

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

 

标签:脚本,脚本语言,doc,painless,查询,source,elasticsearch,ES
From: https://www.cnblogs.com/sunlong88/p/17399603.html

相关文章

  • crontab设置定时任务脚本文件每秒运行一次,每个月最后一天的21点到22点 每20分钟(1200秒
    每秒运行一次#!/bin/bashstep=2for((i=0;i<60;i=(i+step)));dophp/home/www/tp6/thinkzhangsleep$stepdoneexit0每个月最后一天的21点到22点20分钟(1200)执行一次#!/bin/bashtoday=`date+%d`hour=`date+%H`last_day=`cal|xargs|awk'{print$NF}'`if["$to......
  • 实用的网络流量监控脚本
     #!/bin/bashif[-n"$1"];theneth_name=$1elseeth_name="eth0"fii=0send_o=`/sbin/ifconfig$eth_name|grepbytes|awk'{print$6}'|awk-F:'{print$2}'`recv_o=`/sbin/ifconfig$eth......
  • oracle根据 部署环境日志SQL查询中格式不正确 ORA-01810
    --查询TESTDATE数据表中,指定日期的所有字段SELECT*FROMXXCWHEREC.CREATEDATE=TO_DATE('2022-12-2308:50:44','yyyy-MM-ddHH24:mm:ss');ORA-01810报错在进行TO_DATE或者TO_STAMP的操作sql还是报错;由于Oracle中的格式化字符串不区分大小写,所以月份的MM和......
  • 【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无
    Warning:Unexpectedcallto'log'onthecontextobjectafterfunctionexecutionhascompleted.Pleasecheckforasynchronouscallsthatarenotawaitedorcallsto'done'madebeforefunctionexecutioncompletes.Th......
  • MySQL学习日志七,联表查询Join ON
    网上找的七种Join查询图片--查询参加考试的同学,包含的信息包括学号,姓名,科目编号,分数/*分析思路1.分析需求,查询的字段涉及到哪些表2.确定要哪些连接查询3.确定交叉点,涉及到的表有哪些相同的字段判断条件:学生表的studentno=成绩表的studentno*/joinon连接查询joinw......
  • MySQL学习日志六,DQL查询语句
    点我查询狂神school.sql代码DataQueryLanguage:数据查询语言所有的查询都用它select无论是简单的还是复杂的数据都可以查询select是数据库最核心的一个语句,使用频率最高SELECT语句的完整语法为:SELECT[ALL|DISTINCT|DISTINCTROW|TOP]{*|talbe.*|[table.]field1[......
  • Python学习之五_字符串处理生成查询SQL
    Python学习之五_字符串处理生成查询SQL前言昨天想给同事讲解一下获取查询部分表核心列信息的SQL方法也写好了一个简单文档.但是感觉不是很优雅.最近两三天晚上一直在学习Python.想将昨天的文档处理成一个工具的方式.将查询SQL展示出来.然后再由同事手工检查确认.增加时......
  • MyBatis Plus 解决大数据量查询慢问题
    常规查询流式查询游标查询大数据量操作的场景大致如下:数据迁移数据导出批量处理数据在实际工作中当指定查询数据过大时,我们一般使用分页查询的方式一页一页的将数据放到内存处理。但有些情况不需要分页的方式查询数据或分很大一页查询数据时,如果一下子将数据全部加载出......
  • 如何快速查询某苹果产品的各种参数,配件参数
    今天出差,MacBookPro的充电头(专业术语叫电源适配器)忘带了,马上电脑就要没电了,所以打算买一个充电头,想买个跟原装适配器额定功率较为接近的,怕充坏了电脑,但是不知道原来的电源适配器功率是多少,进入到苹果官网,发现很快就找到了结果。操作步骤也适合各种苹果产品的参数搜索,所以记录一......
  • 如何使用Docker构建运行时间较长的脚本
    问题让我们从这个我试图解决的问题开始。我开发了一个会运行很长时间的构建脚本,这个脚本中包含了很多的步骤。这个脚本会运行1-2个小时。它会从网络下载比较大的文件(超过300M)。后面的构建步骤依赖前期构建的库。但最最烦人的是,运行这个脚本真的需要花很长的时间。文件系统是固......