【手把手】ElasticSearch的脚本查询相关

导读:本篇文章讲解 【手把手】ElasticSearch的脚本查询相关,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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

ES 5.0+版本后的Scripting使用的语言默认就是painless,painless是一种专门用于ES的简单,用于内联和存储脚本,是ES 5.0+的默认脚本语言,类似于Java,也有注释、关键字、类型、变量、函数等,是一种安全的脚本语言,并且是Elasticsearch的默认脚本语言。

painless

将id为1的商品价格增加1块钱

【手把手】ElasticSearch的脚本查询相关【手把手】ElasticSearch的脚本查询相关【手把手】ElasticSearch的脚本查询相关

通过这个语法, 相信也能看出来,ctx就是上下文,也就是hits中查询出来的对象。所以可以直接使用ctx._source.price来取对象中的字段值。

【手把手】ElasticSearch的脚本查询相关【手把手】ElasticSearch的脚本查询相关

可直接通过“script”: “ctx._source.price -= 100”简写形式实现一样的效果。

对属性值的修改操作

【手把手】ElasticSearch的脚本查询相关【手把手】ElasticSearch的脚本查询相关【手把手】ElasticSearch的脚本查询相关

删除数据

【手把手】ElasticSearch的脚本查询相关【手把手】ElasticSearch的脚本查询相关【手把手】ElasticSearch的脚本查询相关【手把手】ElasticSearch的脚本查询相关

upsert

【手把手】ElasticSearch的脚本查询相关【手把手】ElasticSearch的脚本查询相关【手把手】ElasticSearch的脚本查询相关

如果id=15的数据存在,就把它的价格增加1000;如果id=15的数据不存在,就新增一条数据。

expression

【手把手】ElasticSearch的脚本查询相关【手把手】ElasticSearch的脚本查询相关

参数化脚本查询

【手把手】ElasticSearch的脚本查询相关

这样做的好处就是没有把参数硬编码到脚本语言中,ES在执行的时候,首次执行会对当前语言进行编译,并且放到缓存区中。当下次再次执行的时候,语句本身没有发生任何的变化,就不需要对语句进行再次编译,直接将值替换即可。

【手把手】ElasticSearch的脚本查询相关

脚本模板

创建模板

【手把手】ElasticSearch的脚本查询相关

查看模板

【手把手】ElasticSearch的脚本查询相关

使用模板

GET /product/_search
{
  “script_fields”: {
    “discount_fields”: {
      “script”: {
        “id”: “calculate_discount”,
        “params”: {
          “discount”: “0.8”
        }
      }
    }
  }

函数式编程

【手把手】ElasticSearch的脚本查询相关【手把手】ElasticSearch的脚本查询相关

“source”: “””  “””,这个”””  “””相当于Java中的{},在”””  “””中写代码就和Java{}中写代码一样

【手把手】ElasticSearch的脚本查询相关

当处理的逻辑比较复杂的时候,采用这种方式会更加的灵活方便

【手把手】ElasticSearch的脚本查询相关

函数式编程中也支持正则表达式以及一些常用的关键字,if-else、while、for等

【手把手】ElasticSearch的脚本查询相关【手把手】ElasticSearch的脚本查询相关【手把手】ElasticSearch的脚本查询相关【手把手】ElasticSearch的脚本查询相关

统计所有价格<1000的商品的tag的数量,不考虑重复的情况

【手把手】ElasticSearch的脚本查询相关

值得注意的是,当使用doc[‘field’].value这个方式获取值的时候,会被加载到内存中放到缓存里,虽然执行的效率更高,但也会消耗更多的内存。而且这种写法只支持获取简单类型(int、long之类的类型)的值,如果是获取复杂类型(对象)的值则会报错,应使用params[‘_source’][‘field’]这种方式去获取。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/111907.html

(0)
Java光头强的头像Java光头强

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!