ES中script脚本的使用

简介: ES中script脚本的使用

一、script脚本的作用


通过使用脚本,可以在 Elasticsearch 计算自定义表达式。例如,可以使用脚本作为字段返回计算值,或者计算查询的自定义得分。


小结:

1、字段的提取

2、表达式计算


二、支持哪些script脚本语言


默认的脚本语言采用的是painless。

21.png


三、script脚本使用示例


1、查询中使用script脚本

PUT my-index-000001/_doc/1
{
  "my_field": 5
}
GET my-index-000001/_search
{
  "script_fields": {
    "my_doubled_field": {
      "script": { 
        "source": "doc['my_field'].value * params['multiplier']", 
        "params": {
          "multiplier": 2
        }
      }
    }
  }
}


2、创建单独的脚本

说明:

通过_scripts命令创建单独的脚本,并通过lang属性指定脚本的语言是painless。

source标签中,可以获取到索引文档中的值。

通过id指定脚本名称来使用独立的脚本。


创建脚本:


POST _scripts/calculate-score
{
  "script": {
    "lang": "painless",
    "source": "Math.log(_score * 2) + params['my_modifier']"
  }
}

获取脚本:

GET _scripts/calculate-score


使用脚本:

GET my-index-000001/_search
{
  "query": {
    "script_score": {
      "query": {
        "match": {
            "message": "some message"
        }
      },
      "script": {
        "id": "calculate-score", 
        "params": {
          "my_modifier": 2
        }
      }
    }
  }
}


删除脚本:


DELETE _scripts/calculate-score


3.通过脚本更新索引字段信息

PUT my-index-000001/_doc/1
{
  "counter" : 1,
  "tags" : ["red"]
}
POST my-index-000001/_update/1
{
  "script" : {
    "source": "ctx._source.counter += params.count",
    "lang": "painless",
    "params" : {
      "count" : 4
    }
  }
}


4.在mappings属性中定义运行时字段

查询的时候,可以直接使用mappings属性中定义的运行时字段day_of_week。

PUT my-index-000001/
{
  "mappings": {
    "runtime": {
      "day_of_week": {
        "type": "keyword",
        "script": {
          "source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ROOT))"
        }
      }
    },
    "properties": {
      "@timestamp": {"type": "date"}
    }
  }
}

5.在查询请求中定义运行时字段

如果没有在索引的mappings属性中定义运行时字段,那么也可以通过_search查询时,通过runtime_mappings来定义运行时字段。

GET my-index-000001/_search
{
  "runtime_mappings": {
    "day_of_week": {
      "type": "keyword",
      "script": {
        "source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ROOT))"
      }
    }
  },
  "aggs": {
    "day_of_week": {
      "terms": {
        "field": "day_of_week"
      }
    }
  }
}

6.使用脚本自定义计算得分

GET index/_search
{
  "query": {
    "script_score": {
      "query": {
        "match": { "body": "elasticsearch" }
      },
      "script": {
        "source": "_score * saturation(doc['pagerank'].value, 10)" 
      }
    }
  }
}


四、script脚本使用的安全性


1、脚本类型限制:script.allowed_types

Elasticsearch 支持2中类型的脚本: inline and stored.

可以通过在elasticsearch.yml配置文件中的script.allowed_types属性来指定允许执行的脚本类型。

相关配置选项:


both 同时支持inline和stored

inline 内联脚本

stored 存储脚本

none 都不支持


2、脚本上下文限制:script.allowed_contexts

默认情况下,所有脚本上下文都是允许的。使用 script.allowed_contexts 设置指定允许的上下文。若要指定不允许上下文,请将 script.allowe_contexts 设置为 none。


示例:允许脚本仅在评分和更新上下文中运行:


script.allowed_contexts: score, update


总结


本文主要介绍了ES中script脚本的使用。

其主要作用是:提取字段属性,进行表达式计算。

最典型的使用场景是:定义运行时字段。

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
目录
相关文章
|
数据采集 机器学习/深度学习 人工智能
Python简直是万能的,这5大主要用途你一定要知道!
Python简直是万能的,这5大主要用途你一定要知道!
1604 0
|
消息中间件 缓存 Kafka
Kafka ProducerConfig和ConsumerConfig配置
Kafka ProducerConfig和ConsumerConfig配置
1437 1
Maven之阿里云镜像仓库配置
方式一:全局配置可以添加阿里云的镜像到maven的setting.xml配置中,这样就不需要每次在pom中,添加镜像仓库的配置,在mirrors节点下面添加子节点: <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.
|
10月前
|
消息中间件 存储 运维
RocketMQ监控与运维实战:从底层原理到生产落地全解析
本文深入解析RocketMQ监控与运维体系,涵盖核心架构、关键指标、实战工具及生产最佳实践,助你构建高可用消息系统。
822 4
|
存储 机器学习/深度学习 缓存
阿里云服务器4核8G配置租用价格:不同实例收费标准、活动价格对比与选购参考
4核8G配置是深受初创企业用户喜欢的云服务器配置,2025年截止目前,按量收费标准最低降至0.45元/小时,包年包月租用平均优惠月价最低仅需159.84元/月,按年购买还可享受u1实例4核8G活动价955.58元/年起的价格。云服务器实例规格和配置不同,收费标准与活动价格也不同,下面是小编为大家整理汇总的阿里云服务器4核8G配置2025年最新收费标准与活动价格。
1495 5
阿里云服务器4核8G配置租用价格:不同实例收费标准、活动价格对比与选购参考
|
存储 弹性计算 Linux
阿里云服务器的【数据盘】是什么意思?必须买数据盘吗?
阿里云服务器的数据盘是独立于系统盘的存储空间,用于存放用户数据、日志等非系统文件,可根据需求选择是否购买。数据盘类型包括ESSD云盘、ESSD AutoPL等,性能与价格各异,适合不同业务场景。系统盘为必需品,而数据盘则可按需添加,支持挂载至ECS实例并初始化后使用。收费模式有按量付费和包年包月,具体价格因盘型和地域而异。了解更多可参考阿里云块存储官方文档。
|
NoSQL Java API
Redisson分布式锁使用详解
通过以上内容,您可以全面了解如何在Java项目中使用Redisson实现分布式锁,并根据不同的业务需求选择合适的锁机制。
1463 33
|
安全 Linux 网络安全
【工具使用】几款优秀的SSH连接客户端软件工具推荐FinalShell、Xshell、MobaXterm、OpenSSH、PUTTY、Terminus、mRemoteNG、Terminals等
【工具使用】几款优秀的SSH连接客户端软件工具推荐FinalShell、Xshell、MobaXterm、OpenSSH、PUTTY、Terminus、mRemoteNG、Terminals等
152777 0
|
存储 安全 Java
深入了解 Elasticsearch 8.1 中的 Script 使用
深入了解 Elasticsearch 8.1 中的 Script 使用
1377 1
|
JavaScript 前端开发 Java
Jeesite5:Star24k,Spring Boot 3.3+Vue3实战开源项目,架构深度拆解!让企业级项目开发效率提升300%的秘密武器
Jeesite5 是一个基于 Spring Boot 3.3 和 Vue3 的企业级快速开发平台,集成了众多优秀开源项目,如 MyBatis Plus、Bootstrap、JQuery 等。它提供了模块化设计、权限管理、多数据库支持、代码生成器和国际化等功能,极大地提高了企业级项目的开发效率。Jeesite5 广泛应用于企业管理系统、电商平台、客户关系管理和知识管理等领域。通过其强大的功能和灵活性,Jeesite5 成为了企业级开发的首选框架之一。访问 [Gitee 页面](https://gitee.com/thinkgem/jeesite5) 获取更多信息。
1052 0
Jeesite5:Star24k,Spring Boot 3.3+Vue3实战开源项目,架构深度拆解!让企业级项目开发效率提升300%的秘密武器