热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:elasticsearchElasticsearch7.XScripting脚本使用详解

篇首语:本文由编程笔记#小编为大家整理,主要介绍了elasticsearchElasticsearch7.XScripting脚本使用详解相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了elasticsearchElasticsearch 7.X Scripting 脚本使用详解相关的知识,希望对你有一定的参考价值。






在这里插入图片描述


1.概述

转载:Elasticsearch 7.X Scripting脚本使用详解


0、题记

除了官方文档,其他能找到的介绍Elasticsearch脚本(Scripting)的资料少之又少。

一方面:性能问题。

官方文档性能优化中明确指出使用脚本会导致性能低;

另一方面:使用场景相对少。

非复杂业务场景下,基础的增、删、改、查基本上就能搞定。

但,不能否认,在解决复杂业务问题(如:自定义评分、自定义文本相关度、自定义过滤、自定义聚合分析)时,脚本依然是Elasticsearch强悍的利器之一。

本文在官方文档基础上,结合实际业务场景,在Elasticsearch7.3环境下进行脚本使用解读。


1、官方scripting使用建议

Avoid scripts——In general, scripts should be avoided.
If they are absolutely needed, you should prefer the painless and expressions engines.


ebay在性能优化实践中也强调(本文做了扩展延伸):

避免使用脚本查询(script query)计算动态字段。

例如:我们有一个包含大量剧院信息的索引,我们需要查询以"Down"开头的所有剧院。你可能运行一个如下脚本查询:

POST seats/_search
{
"query": {
"bool": {
"filter": {
"script": {
"script": {
"lang": "painless",
"source": "doc['theatre'].value.startsWith('Down')"
}
}
}
}
}
}

这个查询非常耗费资源,并且减慢整个系统。

解决方案:

方案一:prefix前缀匹配;实测性能:prefix较scripting性能提升5倍。

方案二:索引时考虑添加一个名为“theatre_prefix”的keyword类型字段。然后我们可以查询"theatre_prefix":"Down"。


2、ES Scripting历史
版本使用脚本

MVEL 脚本

Groovy 脚本

‘>= Elasticsearch 5.0

painless 脚本

Groovy 的出现是解决MVEL的安全隐患问题;
但Groovy仍存在内存泄露+安全漏洞问题,

painless脚本的官宣时间:2016年9月21日。看似很新,截止目前,已经三年左右时间了。

正如其名字:无痛。painless的出现是为了用户更方便、高效的使用脚本。

https://www.elastic.co/cn/blog/painless-a-new-scripting-language


3、Painless Scripting 简介

Painless是一种简单,安全的脚本语言,专为与Elasticsearch一起使用而设计。它是Elasticsearch的默认脚本语言,可以安全地用于内联和存储脚本。

Painless特点:


  1. 性能牛逼:Painless脚本运行速度比备选方案(包括Groovy)快几倍。

  2. 安全性强:使用白名单来限制函数与字段的访问,避免了可能的安全隐患。

  3. 可选输入:变量和参数可以使用显式类型或动态def类型。

  4. 上手容易:扩展了java的基本语法,并兼容groove风格的脚本语言特性。

  5. 特定优化:是ES官方专为Elasticsearch脚本编写而设计。


4、Scripting 应用场景

认知前提:

增删改查能解决业务场景80%的问题,Painless脚本操作一般应用于相对复杂的业务场景中。

常见场景举例如下:

自定义字段
自定义评分
自定义更新
自定义reindex
聚合
其他自定义操作

5、Scripting 使用模板

心中有模板,脚本认知就有了“套路”。

"script": {
"lang": "...",
"source" | "id": "...",
"params": { ... }
}

  1. lang:代表language脚本语言,默认指定为:painless。

  2. source:脚本的核心部分,id应用于:stored script。

  3. params:传递给脚本使用的变量参数。


6、Scripting 实战

6.1 自定义字段

举例:返回原有Mapping未定义的字段值。
如:以my_doubled_field返回my_field字段的翻倍后的结果。

GET my_index/_search
{
"script_fields": {
"my_doubled_field": {
"script": {
"lang": "expression",
"source": "doc['my_field'] * multiplier",
"params": {
"multiplier": 2
}
}
}
}
}

注意:这里脚本语言选择的expression,下一节讲解。

如:返回日期字段中的“年”或“月”或“日”等。


GET hockey/_search
{
"script_fields": {
"birth_year": {
"script": {
"source": "doc.born.value.year"
}
}
}
}

6.2 自定义评分

GET my_index/_search
{
"query": {
"function_score": {
"query": {
"match": {
"text": "quick brown fox"
}
},
"script_score": {
"script": {
"lang": "expression",
"source": "_score * doc['popularity']"
}
}
}
}
}

6.3 自定义更新

Update:将已有字段值赋值给其他字段。

POST hockey/_update/1
{
"script": {
"lang": "painless",
"source": """
ctx._source.last = params.last;
ctx._source.nick = params.nick
""",
"params": {
"last": "gaudreau",
"nick": "hockey"
}
}
}

Update_by_query:满足b开头(注意正则)的字段,末尾添加matched。

POST hockey/_update_by_query
{
"script": {
"lang": "painless",
"source": """
if (ctx._source.last =~ /b/) {
ctx._source.last += "matched";
} else {
ctx.op = "noop";
}
"""
}
}

6.4 自定义reindex

Elasticsearch认证考试题:

index_a包含一些文档, 要求创建索引index_b,通过reindex apiindex_a的文档索引到index_b

要求:


  1. 增加一个整形字段,value是index_a的field_x的字符长度;

  2. 再增加一个数组类型的字段,value是field_y的词集合。

(field_y是空格分割的一组词,比方"foo bar",索引到index_b后,要求变成[“foo”, “bar”])

POST _reindex
{
"conflicts": "proceed",
"source": {
"index": "index_a"
},
"dest": {
"index": "index_b"
},
"script": {
"source": "ctx._source.parts = / /.split(ctx._source.address); ctx._source.tag = ctx._source.city.length();"
}
}

语法参考:

https://www.elastic.co/guide/en/elasticsearch/painless/7.3/painless-regexes.html


6.5 聚合

GET /_search
{
"aggs": {
"genres": {
"terms": {
"script": {
"source": "doc['genre'].value",
"lang": "painless"
}
}
}
}
}

6.6 其他自定义操作

需要结合业务去实践。


7、常见坑及问题

7.1 脚本只有Painless吗?

显然不是,第6节用到的expression 是Lucene’s expressions 脚本语言。

还可以基于脚本引擎自己开发插件实现,

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting-engine.html


7.2 怎么界定是expressions 还是Painless?

"lang": "painless",
"lang": "expressions ",

是唯一区分。


7.3 使用painless就百分之百“无痛”,无漏洞后顾之忧了吗?

凡事不能绝对。
核心注意点:

第一:不要root账户下运行Elasticsearch。
第二:不要公开ES路径给其他用户。
第三:不要公开ES路径到互联网。

实战推荐:

1、用户在搜索框中键入文本,文本将直接发送到后台的match、match_phrase、Simple query string或 Suggesters.

2、作为应用程序开发过程的一部分(而非全部)开放上述查询的脚本。

3、使用用户提供的参数运行脚本。

4、文档固定的Mapping结构。

不推荐:

1、用户可以编写任意scripts, queries(检索), _search requests(search请求)。

2、文档结构可以用户自定义。


8、小结

本文讲解了脚本的发展历史、使用场景、应用实战,但相比于实际业务的复杂需求仍然是九牛一毛。

实战中,肯定还会遇到这样、那样的问题。

一方面:欢迎留言交流。
另一方面:多研读官方文档,很多细节值得深究。


N.参考:

https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-search-speed.html
https://www.infoq.cn/article/elasticsearch-performance-tuning-practice-at-ebay
https://github.com/laoyang360/deep_elasticsearch/blob/master/es_dsl_study/6.scripting.md
https://github.com/elastic/elasticsearch/issues/19396
https://www.youtube.com/watch?v=3FLEJJ8PsM4
https://blog.csdn.net/u013613428/article/details/78134170
————————————————
版权声明:本文为CSDN博主「铭毅天下」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/laoyang360/article/details/100869751






推荐阅读
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
author-avatar
手机用户2602883667
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有