重庆涪陵网站设计公司哪家专业,花生棒 做网站,成全视频免费观看在线看第2季,昆山网站设计公司脚本查询 概念 Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强大的脚本功能#xff0c;ES支持多种脚本语言#xff0c;如painless#xff0c;其语法类似于Java,也有注释、关键字、类型、变量、函数等#xff0c;其就要相对于其他脚本高出几倍的性…脚本查询 概念 Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强大的脚本功能ES支持多种脚本语言如painless其语法类似于Java,也有注释、关键字、类型、变量、函数等其就要相对于其他脚本高出几倍的性能并且安全可靠可以用于内联和存储脚本。 支持的语言 groovyES 1.4.x-5.0的默认脚本语言 painlessJavaEE使用java语言开发.Net使用C#/F#语言开发Flutter使用Dart语言开发同样ES 5.0版本后的Scripting使用的语言默认就是painlesspainless是一种专门用于Elasticsearch的简单,用于内联和存储脚本是ES 5.0的默认脚本语言类似于Java,也有注释、关键字、类型、变量、函数等是一种安全的脚本语言。并且是Elasticsearch的默认脚本语言。 其他 expression每个文档的开销较低表达式的作用更多可以非常快速地执行甚至比编写native脚本还要快支持javascript语法的子集单个表达式。缺点只能访问数字布尔值日期和geo_point字段存储的字段不可用 mustache提供模板参数化查询 特点 语法简单学习成本低灵活度高可编程能力强性能相较于其他脚本语言很高安全性好独立语言虽然易学但仍需单独学习相较于DSL性能低不适用于复杂的业务场景 应用场景各种复杂的应用场景如自定义评分、自定义聚合查询等。 正则: 早先某些版本正则表达式默认情况下处于禁用模式因为它绕过了painless的针对长时间运行和占用内存脚本的保护机制。而且有深度对战行为。如果需要开启正则需要配置script.painless.regex.enabled: true 注意通常正则的使用范围比较小应用范围基本限制在数据量比较小和并发量比较小的应用场景下。 doc[‘field’].value和params[‘_source’][‘field’] 理解之间的区别是很重要的doc[‘field’].value和params[‘_source’][‘field’]。首先使用doc关键字将导致该字段的条件被加载到内存缓存这将导致更快的执行但更多的内存消耗。此外doc[…]符号只允许简单类型不能返回一个复杂类型(JSON对象或者nested类型)只有在非分析或单个词条的基础上有意义。但是doc如果可能使用仍然是从文档访问值的推荐方式因为_source每次使用时都必须加载并解析。使用_source非常缓慢
脚本查询-实战教程
1、对索引中的数据进行修改
价格减一
POST product/_update/2
{script: {source: ctx._source.price-1}
}小米10出了新款 新增了tag 叫做“无线充电”
POST product/_update/6
{script: {lang: painless,source: ctx._source.tags.add(无线充电)}
}2、将文档从一个索引复制到另一个索引。它允许用户将数据从一个索引重新索引到另一个索引
POST _reindex
{source: {index: product},dest: {index: product2}
}3、删除索引中的数据 执行delete操作
POST product/_update/10
{script: {lang: painless,source: ctx.opdelete}
}4、upsert有则更新否则插入
POST product/_update/19
{script: {lang: painless,source: ctx._source.price 100},upsert: {name : 小米手机10,desc : 充电贼快掉电更快超级无敌望远镜高刷电竞屏,price : 1999}
}5、参数化操作索引数据
POST product/_update/6
{script: {lang: painless,source: ctx._source.tags.add(params.tag_name),params: {tag_name:无线秒充}}
}6、对索引数据进行多次操作
GET product/_search
{script_fields: {price: {script: {lang: painless,source: doc[price].value}},discount_price: {script: {lang: painless,source: [doc[price].value* params.discount_8,doc[price].value* params.discount_7,doc[price].value* params.discount_6,doc[price].value* params.discount_5],params: {discount_8: 0.8,discount_7: 0.7,discount_6: 0.6,discount_5: 0.5}}}}
}7、模板脚本
#创建脚本模板
POST _scripts/calculate_discount
{script: {lang: painless,source: doc.price.value * params.discount}
}
#查看
GET _scripts/calculate_discount
#使用模板进行数据运算
GET product/_search
{script_fields: {price: {script: {lang: painless,source: doc[price].value}},discount_fields: {script: {id: calculate_discount,params: {discount:0.8}}}}
}8、函数式编程
#Scripting的函数式编程
GET product/_search
GET product/_doc/1
POST product/_update/1
{script: {lang: painless,source: ctx._source.tags.add(params.tag_name),params: {tag_name:无线秒充}}
}POST product/_update/1
{script: {lang: painless,source: ctx._source.tags.add(params.tag_name);ctx._source.price-100;,params: {tag_name:无线秒充1}}
}9、正则表达式
#正则like %小米% /[\s\S]*小米[\s\S]*/
POST product/_update/4
{script: {lang: painless,source: if(ctx._source.name ~ /[\s\S]*小米[\s\S]*/) {ctx._source.name***|}else{ctx.opnoop}}
}
#/\d{4}-\d{2}-\d{2}[\s\S]*/
GET product/_doc/1
POST product/_update/1
{script: {lang: painless,source: if(ctx._source.createtime ~ /\d{4}-\d{2}-\d{2}[\s\S]*/) {ctx._source.name|***}else{ctx.opnoop}}
}10、聚合查询一起使用
GET product/_search
#统计所有价格小于1000的商品的tag的数量 不考虑重复的情况
GET product/_mapping
GET product/_search
{query: {constant_score: {filter: {range: {price: {lte: 1000}}}}},aggs: {tag_agg: {sum: {script: {lang: painless,source: int total 0;for(int i 0; i doc[tags.keyword].length; i){total;}return total;}}}}
}