Lucene表达式语言

edit

Lucene表达式语言

edit

Lucene的表达式将一个javascript表达式编译为字节码。它们被设计用于高性能的自定义排名和排序功能,并且默认情况下为inlinestored脚本启用。

性能

edit

表达式旨在与自定义Lucene代码具有竞争力的性能。 这种性能是由于每个文档的开销较低,与其他脚本引擎相比:表达式在“前期”做得更多。

这使得执行速度非常快,甚至比您编写的native脚本还要快。

语法

edit

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

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

expression脚本中的变量可供访问:

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

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

数值字段 API

edit
Expression Description

doc['字段名'].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

edit

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

Expression Description

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 表示一月。

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

edit
Expression Description

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)

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

限制

edit

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

  • 仅数字、布尔日期地理点字段可以被访问
  • 存储字段不可用