# Groovy 脚本语言

原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/5.3/modules-scripting-groovy.html](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/modules-scripting-groovy.html)

译文链接 : [http://www.apache.wiki/pages/editpage.action?pageId=10027176](http://www.apache.wiki/pages/editpage.action?pageId=10027176)

贡献者 : [@琴剑蓝天](http://www.apache.wiki/users/viewuserprofile.action?username=xujie)，[ApacheCN](/display/~apachecn)，[Apache中文网](/display/~apachechina)

5.0.0中弃用。
Groovy将被新的脚本语言Painless所取代

默认情况下，**Groovy** 可用于Elasticsearch。 虽然受 **Java** 安全管理器限制，但它不是沙盒语言，默认情况下只能使用文件脚本。

启用内联或存储的Groovy脚本是一种安全风险，只有当您的Elasticsearch集群受到外部环境的保护时，才应该考虑。 即使一个简单的 _while（true）{}_ 循环也可能作为对您的集群的拒绝服务攻击。

 有关脚本的安全问题的详细信息，请参阅[脚本和安全性](https://www.elastic.co/guide/en/elasticsearch/reference/5.3/modules-scripting-security.html)，包括如何自定义类白名单。

## Doc值属性和方法

**Groovy** 中的 **Doc** 值支持以下属性和方法（取决于底层字段类型）：

_doc['field_name'].value_

     字段的本机值。例如，如果它是一个短型，它会很短。

_doc['field_name'].values_

    字段的本机数组值。例如，如果它是一个简短的类型，它会很短[]。请记住，一个字段可以在单个文档中具有多个值。如果该字段没有值，则返回一个空数组。

_doc['field_name'].empty_

一个布尔值，指示该字段在文档中是否没有值。

 _doc['field_name'].lat_

地理位置类型的纬度，或空值。

_doc['field_name'].lon_

地理点类型的经度，或空值。

_doc['field_name'].lats_

    地理点类型的纬度或空数组。

_doc['field_name'].lons_

    地理点类型的经度，或空数组。

_doc['field_name'].arcDistance(lat, lon)_

    该地理点字段与提供的纬度/距离的弧距（以米为单位）。

_doc['field_name'].arcDistanceWithDefault(lat, lon, default)_

    该地理点字段与提供的lat / lon的弧距（以米为单位），具有空字段的默认值

_doc['field_name'].planeDistance(lat, lon)_

    该地理点字段与提供的纬度/距离的平面距离（以米为单位）。

_doc['field_name'].planeDistanceWithDefault(lat, lon, default)_

    该地理点字段与提供的lat / lon的平面距离（以米为单位），空字段的默认值

_doc['field_name'].geohashDistance(geohash)_

    该地理位置字段与提供的geohash的弧距（以米为单位）。

_doc['field_name'].geohashDistanceWithDefault(geohash, default) _ 

    来自提供的 _geohash_ 的该地理点字段的弧距（以米为单位），空字段的默认值

## Groovy内置功能

有几个可以在脚本中使用的内置函数。 他们包括：

| 函数 | 描述 |
| --- | --- |
| `sin(a)` | 返回角度的三角正弦。 |
| `cos(a)` | 返回角度的三角余弦。 |
| `tan(a)` | 返回角度的三角正切。 |
| `asin(a)` | 返回一个值的正弦。 |
| `acos(a)` | 返回值的反余弦值。 |
| `atan(a)` | 返回值的反正切值。 |
| `toRadians``(angdeg)` | 将以度为单位的角度转换为以弧度测量的大致相等的角度 |
| `toDegrees``(angrad)` | 将以度为单位的角度转换为以弧度测量的大致相等的角度 |
| `exp(a)` | 返回欧拉的数字e提高到价值的力量。 |
| `log(a)` | 返回欧拉的数字e提高到价值的力量。 |
| `log10(a)` | 返回欧拉的数字e提高到价值的力量。 |
| `sqrt(a)` | 返回欧拉的数字e提高到价值的力量。 |
| `cbrt(a)` | 返回双值的多维数据集根。 |
| `IEEEremainder``(f1, f2)` | 根据IEEE 754标准计算两个参数的余数运算。 |
| `ceil(a)` | 返回大于或等于参数的最小（最接近负的无穷大）值，并且等于数学整数。 |
| `floor(a)` | 返回小于或等于参数的最大（最接近正无穷大）的值，等于一个数学整数。 |
| `rint(a)` | 返回与参数最接近的值，并等于数学整数。 |
| `atan2(y, x)` | 从直角坐标（x，y）到极坐标（r，theta）的转换返回角度θ。 |
| `pow(a, b)` | 将第一个参数的值返回到第二个参数的幂。 |
| `round(a)` | 返回最接近参数的int。 |
| `random()` | 返回一个随机双重值。 |
| `abs(a)` | 返回值的绝对值。 |
| `max(a, b)` | 返回两个值中的较大值。 |
| `min(a, b)` | 返回两个值中的较小值。 |
| `ulp(d)` | 返回参数的ulp的大小。 |
| `signum(d)` | 返回参数的signum函数。 |
| `sinh(x)` | 返回值的双曲正弦。 |
| `cosh(x)` | 返回值的双曲余弦值。 |
| `tanh(x)` | 返回值的双曲正切值。 |
| `hypot(x, y)` | 返回sqrt（x2 + y2），没有中间溢出或下溢。 |