elasticsearch 使用Painless脚本

文章目录

      • 1. 创建索引
      • 2. 插入模拟数据
      • Painless 脚本的基本特点:
      • Painless 脚本的常见用途
      • 1. 脚本查询和过滤
        • 示例:基于脚本的查询
      • 2. 脚本字段
        • 示例:脚本字段
      • 3. 聚合中的脚本
        • 示例:脚本聚合
      • 4. 文档更新中的脚本
        • 示例:文档更新
      • 5. 排序中的脚本
        • 示例:脚本排序
      • Painless 脚本的常见用法和注意事项
        • 1. **访问字段**
        • 2. **参数传递**
        • 3. **条件判断**
        • 4. **限制**
        • 5. **调试脚本**
      • 总结

1. 创建索引

首先,我们可以创建一个包含适当字段的 products 索引,并定义字段的映射(mapping)。例如,我们可以使用 text 类型来存储产品名称,keyword 类型来存储分类,floatdouble 类型来存储价格、评分和折扣。

PUT /products
{"mappings": {"properties": {"product_name": {"type": "text"},"price": {"type": "float"},"category": {"type": "keyword"},"rating": {"type": "float"},"discount": {"type": "float"},"availability": {"type": "boolean"},"stock": {"type": "integer"},"release_date": {"type": "date"}}}
}

2. 插入模拟数据

接下来,我们插入一些模拟产品数据到 products 索引。以下是一些数据样本:

POST /products/_doc/1
{"product_name": "Apple iPhone 15","price": 999.99,"category": "Smartphones","rating": 4.5,"discount": 0.1,"availability": true,"stock": 50,"release_date": "2023-09-01"
}POST /products/_doc/2
{"product_name": "Samsung Galaxy S24","price": 899.99,"category": "Smartphones","rating": 4.3,"discount": 0.05,"availability": true,"stock": 30,"release_date": "2023-10-10"
}POST /products/_doc/3
{"product_name": "Dell XPS 13","price": 1199.99,"category": "Laptops","rating": 4.8,"discount": 0.15,"availability": true,"stock": 20,"release_date": "2023-08-20"
}POST /products/_doc/4
{"product_name": "Sony WH-1000XM5","price": 349.99,"category": "Headphones","rating": 4.7,"discount": 0.2,"availability": false,"stock": 0,"release_date": "2023-06-15"
}POST /products/_doc/5
{"product_name": "Apple MacBook Air","price": 999.00,"category": "Laptops","rating": 4.6,"discount": 0.1,"availability": true,"stock": 15,"release_date": "2023-11-01"
}POST /products/_doc/6
{"product_name": "Fitbit Charge 5","price": 149.99,"category": "Wearables","rating": 4.4,"discount": 0.05,"availability": true,"stock": 80,"release_date": "2023-07-10"
}

在 Elasticsearch 中,Painless 是一种用于查询和聚合操作的内置脚本语言。它被设计为高效、安全、且易于使用的脚本语言,用于在 Elasticsearch 中执行动态计算。Painless 可以在许多不同的场景中使用,比如在 查询过滤器聚合文档更新排序脚本字段 等操作中动态计算值。

Painless 脚本的基本特点:

  • 高效:Painless 脚本会经过优化,执行速度较快。
  • 安全:Painless 会在执行过程中检查潜在的安全问题,防止执行恶意代码。
  • 易用:语法简洁,类似于 Java,但也有一些简化和限制。

Painless 脚本的常见用途

  1. 脚本查询和过滤
  2. 脚本字段
  3. 聚合中的脚本
  4. 文档更新
  5. 排序

1. 脚本查询和过滤

你可以使用 Painless 脚本来动态计算查询条件。例如,假设你要查询文档中的字段 price 是否大于某个动态值:

示例:基于脚本的查询
POST /products/_search
{"query": {"script_score": {"query": {"match_all": {}},"script": {"source": "doc['price'].value > params.threshold ? 1 : 0","params": {"threshold": 1000}}}}
}

在这个查询中,script_score 根据 price 字段的值与 threshold 参数进行比较,只有当 price > 1000 时,文档才会匹配查询。
在这里插入图片描述

2. 脚本字段

Painless 脚本可以用于计算查询结果中的 脚本字段,允许你在查询结果中添加基于其他字段计算的动态值。

示例:脚本字段

假设每个文档都有 pricetax 字段,你想在查询结果中计算每个文档的总价(price + tax)。

POST /products/_search
{"query": {"match_all": {}},"script_fields": {"total_price": {"script": {"lang": "painless","source": "doc['price'].value + doc['discount'].value"}}}
}

这将为每个文档添加一个名为 total_price 的字段,字段值是 price + discount 的和。

在这里插入图片描述

3. 聚合中的脚本

Painless 脚本还可以用在聚合操作中,用于对字段值进行动态计算。例如,基于某个条件计算总和或平均值。

示例:脚本聚合

假设你想计算所有产品的 price 字段的加权平均值,其中权重来自于另一个字段 rating

POST /products/_search
{"size": 0,"aggs": {"weighted_avg_price": {"avg": {"script": {"lang": "painless","source": "doc['price'].value * doc['rating'].value"}}}}
}

在这个例子中,weighted_avg_price 聚合会计算 price * rating 的平均值。
在这里插入图片描述

4. 文档更新中的脚本

Painless 脚本可以用来动态更新文档中的字段。这在批量更新或修改文档时非常有用,特别是当更新的内容需要基于现有字段的值进行计算时。

示例:文档更新

假设你有一个文档中存储了 pricediscount 字段,现在你想要根据 discount 更新 price

POST /products/_update/1
{"script": {"lang": "painless","source": "ctx._source.price = ctx._source.price - (ctx._source.price * ctx._source.discount)"}
}

在这个例子中,price 字段会根据 discount 字段的值进行折扣更新。
在这里插入图片描述

5. 排序中的脚本

你可以使用 Painless 脚本对搜索结果进行动态排序。例如,假设你要根据一个计算出来的值进行排序,而这个值是由多个字段计算得出的。

示例:脚本排序

假设你有 ratingprice 字段,你想按照 rating 除以 price 的结果对文档进行排序:

POST /products/_search
{"query": {"match_all": {}},"sort": [{"_script": {"type": "number","script": {"lang": "painless","source": "doc['rating'].value / doc['price'].value"},"order": "desc"}}],"script_fields": {"rating_to_price_ratio": {"script": {"lang": "painless","source": "doc['rating'].value / doc['price'].value"}}}
}

在这个例子中,文档将按照 rating / price 的值进行降序排序。

在这里插入图片描述


Painless 脚本的常见用法和注意事项

1. 访问字段

在 Painless 中,你可以使用 doc['field_name'].value 来访问字段的值。如果字段是多值字段,你可以使用 doc['field_name'].values 来获取所有的值。

  • 对于文本字段:doc['text_field'].value 返回的是字段的一个值(如果该字段为多值字段,Painless 默认取第一个值)。
  • 对于数字字段:可以像上面的示例那样直接访问数字字段。
2. 参数传递

你可以通过 params 来传递外部参数到脚本中,这样就能在脚本中动态使用这些值。

{"query": {"range": {"price": {"gte": "{{params.min_price}}"}}},"params": {"min_price": 100}
}

在这里,params.min_price 是传递给脚本的参数。

3. 条件判断

Painless 支持基本的条件判断,比如 if 语句。可以用来执行基于条件的计算。

{"script": {"lang": "painless","source": """if (doc['discount'].size() != 0) {return doc['price'].value - (doc['price'].value * doc['discount'].value);} else {return doc['price'].value;}"""}
}

这个脚本判断如果 discount 字段存在,就对 price 进行折扣计算,否则返回原价。

4. 限制
  • 性能:虽然 Painless 被设计成高效的,但大量的动态计算会对性能产生一定的影响。尽量避免在查询或聚合中使用过于复杂的脚本,尤其是在大规模数据集上。
  • 沙盒环境:Painless 是运行在沙盒环境中的,意味着它的功能被严格限制,无法进行一些危险的操作,如文件操作、网络请求等。
5. 调试脚本

Painless 脚本支持调试输出,可以在开发时利用 _explain 或者调试日志来查看脚本的执行情况。

总结

Painless 是 Elasticsearch 中强大且高效的脚本语言,广泛应用于查询、更新、聚合、排序等多种操作。通过使用 Painless 脚本,开发者可以对 Elasticsearch 的行为进行细粒度的控制和动态计算,从而实现更灵活的功能。

在实际应用中,合理使用 Painless 脚本能够帮助解决复杂的数据计算需求,但也需要注意性能和安全性,避免过度使用脚本影响集群性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/889906.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Elasticsearch】高亮搜索:从原理到Web呈现

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

短视频矩阵源代码部署过程中可能遇到的常见问题及其概述

技术选型挑战 前端技术栈:不恰当的选择可能导致界面响应迟缓、用户交互体验不佳。例如,HTML、CSS、JavaScript等前端技术的运用不当,会影响页面的渲染速度和交互流畅性。 后端技术:后端开发语言的选择若与项目需求不匹配&#xff…

15.初始接口1.0 C#

这是一个用于实验接口的代码 适合初认识接口的人 【CSDN开头介绍】(文心一言AI生成) 在C#编程世界中,接口(Interface)扮演着至关重要的角色,它定义了一组方法,但不提供这些方法的实现。接口作为…

什么是正则化?Regularization: The Stabilizer of Machine Learning Models(中英双语)

正则化:机器学习模型的稳定器 1. 什么是正则化? 正则化(Regularization)是一种在机器学习模型训练中,通过约束模型复杂性以防止过拟合的技术。 它的核心目标是让模型不仅在训练集上表现良好,还能在测试集上…

Day9 神经网络的偏导数基础

多变量函数与神经网络 在神经网络中,我们经常遇到多变量函数。这些函数通常描述了网络的输入、权重、偏置与输出之间的关系。例如,一个简单的神经元输出可以表示为: z f ( w 1 x 1 w 2 x 2 … w n x n b ) z f(w_1x_1 w_2x_2 \ldots…

map和set题目练习

一、习题一:随机链表的复制 1.1题目详情 1.2思路 在没有学习map和set之前,解决这道题最大的问题就在于无法建立原链表与拷贝链表的映射关系,只能通过在原链表每个节点后面新建一个新的链表来进行节点间的对应,而学习了map之后&a…

Hw亮度省电

1. 亮度控制策略 /decompile-hw/decompile/app/HwPowerGenieEngine3/src/main/res/xml/backlight_policy.xml <?xml version"1.0" encoding"utf-8"?> 2 <backlight_policy xmlns:android"http://schemas.android.com/apk/res/android&qu…

C语言入门(一):A + B _ 基础输入输出

前言 本专栏记录C语言入门100例&#xff0c;这是第&#xff08;一&#xff09;例。 目录 一、【例题1】 1、题目描述 2、代码详解 二、【例题2】 1、题目描述 2、代码详解 三、【例题3】 1、题目描述 2、代码详解 四、【例题4】 1、题目描述 2、代码详解 一、【例…

【21天学习AI底层概念】day8 什么是类意识?

类意识&#xff08;Quasi-Consciousness&#xff09; 是一个用来描述人工智能或复杂系统表现出的类似意识的行为或特性的概念。虽然这种系统不具备真正的意识&#xff08;即主观体验、情感和自我觉知&#xff09;&#xff0c;但在外部表现上&#xff0c;它们可能表现出与有意识…

Docker 镜像源 阿里镜像源限制后其他镜像源

要在Docker中修改镜像源&#xff0c;你需要编辑或创建Docker的配置文件来指定新的镜像源地址。以下是如何为Docker配置中国镜像源的步骤&#xff1a; 找到或创建Docker的配置文件daemon.json。 在Linux系统中&#xff0c;该文件通常位于/etc/docker/目录下。 编辑daemon.jso…

渗透测试学习笔记(五)网络

一.IP地址 1. IP地址详解 ip地址是唯一标识&#xff0c;一段网络编码局域网&#xff08;内网&#xff09;&#xff1a;交换机-网线-pcx.x.x.x 32位置2进制&#xff08;0-255&#xff09; IP地址五大类 IP类型IP范围A类0.0.0.0 到 127.255.255.255B类128.0.0.0 到191.255.25…

《自制编译器》--青木峰郎 -读书笔记 编译hello

在该书刚开始编译hello.cb时就遇到了问题。 本人用的是wsl&#xff0c;环境如下&#xff0c; 由于是64位&#xff0c;因此根据书中的提示&#xff0c;从git上下载了64位的cb编译器 cbc-64bit 问题一: 通过如下命令编译时,总是报错。 cbc -Wa,"--32" -Wl,"-…

LruCache(本地cache)生产环境中遇到的问题及改进

问题&#xff1a;单机qps增加时请求摘要后端&#xff0c;耗时也会增加&#xff0c;因为超过了后端处理能力&#xff08;最大qps&#xff0c;存在任务堆积&#xff09;。 版本一 引入LruCache。为了避免数据失效&#xff0c;cache数据的时效性要小于摘要后端物料的更新时间&…

jedis使用及注意事项

Jedis Jedis 是一个 Java 客户端&#xff0c;用于与 Redis 数据库进行交互。它提供了一系列简单易用的 API&#xff0c;使得在 Java 应用程序中使用 Redis 变得非常方便。以下是 Jedis 的使用方法及一些注意事项。 Jedis的优势 Lettuce客户端及Jedis客户端比较如下&#xff1a;…

CSDN博客:如何使用Python的`datasets`库转换音频采样率

CSDN博客&#xff1a;如何使用Python的datasets库转换音频采样率 什么是采样率&#xff1f;代码用途&#xff1a;调整音频数据的采样率完整代码示例代码详解运行结果&#xff08;示例&#xff09;总结 在这篇文章中&#xff0c;我们将学习如何使用Python的datasets库对音频数据…

浏览器执行机制

主线程 任务1&#xff0c;任务2 微队列微队列任务1&#xff0c; 微队列任务2延时队列延时队列任务1&#xff0c; 延时队列任务2交互队列.... 事件循环的工作原理 主线程执行同步任务&#xff1a; 主线程首先执行所有同步任务&#xff08;即栈中的任务&#xff09;。这些任务会…

Java 基础知识——part 4

8.成员方法&#xff1a;Java中必须通过方法才能对类和对象的属性操作&#xff1b;成员方法只在类的内部声明并加以实现。一般声明成员变量后再声明方法。 9.方法定义 方法的返回值是向外界输出的信息&#xff0c;方法类型和返回值类型同&#xff1b;返回值通过return返回&…

设计模式12:抽象工厂模式

系列总链接&#xff1a;《大话设计模式》学习记录_net 大话设计-CSDN博客 参考&#xff1a; C设计模式&#xff1a;抽象工厂模式&#xff08;风格切换案例&#xff09;_c 抽象工厂-CSDN博客 1.概念 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是软件设计…

【YashanDB知识库】kettle同步大表提示java内存溢出

【问题分类】数据导入导出 【关键字】数据同步&#xff0c;kettle&#xff0c;数据迁移&#xff0c;java内存溢出 【问题描述】kettle同步大表提示ERROR&#xff1a;could not create the java virtual machine! 【问题原因分析】java内存溢出 【解决/规避方法】 ①增加JV…

适配体技术在新药发现中的应用

适配体筛选技术在新药发现中的具体应用 适配体筛选技术&#xff0c;特别是SELEX&#xff08;Systematic Evolution of Ligands by Exponential Enrichment&#xff0c;指数富集的配体系统进化技术&#xff09;&#xff0c;在新药发现中扮演着至关重要的角色。这种技术能够从庞…