ES-painless脚本语言

painless

Painless 是 Elasticsearch 中的脚本语言,专为高性能、简单和安全的脚本执行设计。它广泛用于 Elasticsearch 的自定义脚本需求中,比如过滤条件、聚合和数据处理任务。Painless 语言的语法和 Java 相似,提供了丰富的内置方法和类型支持, 可以高效处理文档数据。

Painless 的主要用途

* 过滤脚本:根据复杂条件过滤文档。
* 脚本化字段:动态计算和返回新字段。
* 聚合脚本:在聚合中进行复杂的计算或动态分组。
* 评分脚本:用于自定义搜索结果的评分逻辑。

Painless 基本语法

  Painless 脚本的编写和 Java 或 Groovy 类似,但 Painless 更加安全且执行更快。以下是一些 Painless 的基础语法:

变量声明:

painless
int x = 10;
double y = 3.14;
String name = 'Elasticsearch';

条件语句:

painless
if (x > 0) {
    return "Positive";
} else {
    return "Non-positive";
}

循环:

painless
for (int i = 0; i < 10; i++) {
    // 执行操作
}

访问文档字段:

使用 doc 关键字访问倒排索引中的字段(只读):

painless

if (doc['age'].value > 18) {
    return "Adult";
}

使用 params 访问外部传入的参数:

painless

String country = params['country'];

字符串操作:

painless

String name = "Elastic";
String result = name + "search";

数组和集合:

Painless 支持列表和映射。

painless
List items = ['apple', 'banana', 'cherry'];
Map info = {'name': 'Alice', 'age': 25};

Painless 聚合示例

假设我们要聚合数据,并希望自定义每个桶的分组条件:

painless
{
  "aggs": {
    "custom_buckets": {
      "terms": {
        "script": {
          "source": """
            if (doc['age'].size() > 0 && doc['age'].value >= 18) {
                return "Adult";
            } else {
                return "Minor";
            }
          """,
          "lang": "painless"
        }
      }
    }
  }
}
posted @   XieBuWan  阅读(265)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示