Lucene 表达式语言编辑

Lucene 的表达式将 javascript 表达式编译为字节码。它们专为高性能自定义排名和排序函数而设计,默认情况下对 内联存储 脚本启用。

性能编辑

表达式的设计目标是使其性能与自定义 Lucene 代码相媲美。这种性能归功于与其他脚本引擎相比,每个文档的开销较低:表达式更多地是在“前期”完成工作。

这允许非常快的执行速度,甚至比您编写 原生 脚本还要快。

语法编辑

表达式支持 javascript 语法的子集:单个表达式。

有关可用运算符和函数的详细信息,请参阅表达式模块文档

可以使用 expression 脚本中的变量来访问

  • 文档字段,例如 doc['myfield'].value
  • 字段支持的变量和方法,例如 doc['myfield'].empty
  • 传递给脚本的参数,例如 mymodifier
  • 当前文档的分数,_score(仅在 script_score 中使用时可用)

您可以将表达式脚本用于 script_scorescript_fields、排序脚本和数值聚合脚本,只需将 lang 参数设置为 expression 即可。

数值字段 API编辑

表达式 描述

doc['field_name'].value

字段的值,作为 double 类型

doc['field_name'].empty

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

doc['field_name'].length

此文档中的值的数量。

doc['field_name'].min()

此文档中字段的最小值。

doc['field_name'].max()

此文档中字段的最大值。

doc['field_name'].median()

此文档中字段的中位数。

doc['field_name'].avg()

此文档中值的平均值。

doc['field_name'].sum()

此文档中值的总和。

当文档完全缺少该字段时,默认情况下,该值将被视为 0。您可以将其视为另一个值,例如 doc['myfield'].empty ? 100 : doc['myfield'].value

当文档的字段有多个值时,默认情况下将返回最小值。您可以选择其他值,例如 doc['myfield'].sum()

当文档完全缺少该字段时,默认情况下,该值将被视为 0

布尔字段作为数值公开,true 映射到 1false 映射到 0。例如:doc['on_sale'].value ? doc['price'].value * 0.5 : doc['price'].value

日期字段 API编辑

日期字段被视为自 1970 年 1 月 1 日以来的毫秒数,并支持上述数值字段 API,以及对某些特定于日期的字段的访问

表达式 描述

doc['field_name'].date.centuryOfEra

世纪 (1-2920000)

doc['field_name'].date.dayOfMonth

日期 (1-31),例如,每月的第一天为 1

doc['field_name'].date.dayOfWeek

星期几 (1-7),例如,星期一为 1

doc['field_name'].date.dayOfYear

一年中的第几天,例如,1 月 1 日为 1

doc['field_name'].date.era

纪元:公元前为 0,公元为 1

doc['field_name'].date.hourOfDay

小时 (0-23)。

doc['field_name'].date.millisOfDay

一天中的毫秒数 (0-86399999)。

doc['field_name'].date.millisOfSecond

一秒钟内的毫秒数 (0-999)。

doc['field_name'].date.minuteOfDay

一天中的分钟数 (0-1439)。

doc['field_name'].date.minuteOfHour

一小时内的分钟数 (0-59)。

doc['field_name'].date.monthOfYear

一年中的月份 (1-12),例如,1 月为 1

doc['field_name'].date.secondOfDay

一天中的秒数 (0-86399)。

doc['field_name'].date.secondOfMinute

一分钟内的秒数 (0-59)。

doc['field_name'].date.year

年份 (-292000000 - 292000000)。

doc['field_name'].date.yearOfCentury

世纪内的年份 (1-100)。

doc['field_name'].date.yearOfEra

纪元内的年份 (1-292000000)。

以下示例显示了 date 字段 date0 和 date1 之间的年差

doc['date1'].date.year - doc['date0'].date.year

geo_point 字段 API编辑

表达式 描述

doc['field_name'].empty

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

doc['field_name'].lat

地理点的纬度。

doc['field_name'].lon

地理点的经度。

以下示例计算距华盛顿特区的距离(以公里为单位)

haversin(38.9072, 77.0369, doc['field_name'].lat, doc['field_name'].lon)

在本例中,坐标可以作为参数传递给脚本,例如,基于用户的地理位置。

限制编辑

相对于其他脚本语言,存在一些限制

  • 只能访问数值、布尔值日期geo_point 字段
  • 存储字段不可用