Lucene表达式语言

Lucene的表达式将javascript表达式编译成字节码。 它们是为高性能定制 排名(ranking)和排序(sorting) 功能而设计的,默认情况下支持内联(inline)和存储的(stored)脚本。

性能

表达式被设计成具有与自定义Lucene代码相媲美的性能。 这种性能是因为与其他脚本引擎相比,每个文档的开销较低:表达式做了更多的“预先准备”。

这使得执行速度非常快,甚至比编写原生(native)脚本还要快。

语法

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

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

expression脚本中的变量可用于访问:

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

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

numeric字段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()

布尔(bool)字段显示为数字,true映射为1false映射为0。 例如:doc['on_sale'].value ? doc['price'].value * 0.5 : doc['price'].value

date字段API

date字段被视为自1970年1月1日以来的毫秒数,并支持上述numeric字段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号。

doc['field_name'].date.era

纪元,0 表示 公元前(BC),1 表示公元(AD)。

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

表达式 描述

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)

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

局限性

相对于其他脚本语言有一些限制:

  • 只能访问 numeric、boolean、date 及 geo_point 字段
  • 存储(的)字段不可用