Skip to main content

Lucene expressions language

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

Performance

Expressions 旨在与高性能的 Lucene 代码。这种性能是由于与其他脚本引擎相比,每个文档的开销较低:表达式更“up-front”。 这允许非常快速的执行,甚至比您编写本机脚本还要快

语法

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

表达式脚本中可用于访问的变量:

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

您可以将表达式脚本用于 script_score、script_fields、sort scripts、numeric aggregation scripts, 只需将lang参数设置为expression即可。

Numeric field API

Expression说明
doc['field_name'].value字段的值
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()此文档中字段的总和
tip
  • 当文档完全缺少字段时,默认值将被视为0。您可以将其视为另一个值,例如 doc['myfield'].empty ? 100 : doc['myfield'].value
  • 当文档具有多个字段值时,默认情况下返回最小值。您可以选择不同的值,例如 doc['myfield'].sum()
  • 当文档完全缺少字段时,默认值将被视为0。
  • 布尔字段暴露为数字,true映射为1,false映射为0。例如:doc['on_sale'].value ? doc['price'].value * 0.5 : doc['price'].value

Date field API

Expression说明
doc['field_name'].date.centuryOfEra100年 (1-2920000)
doc['field_name'].date.dayOfMonthDay (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.monthOfYear年内月份 (1-12)
doc['field_name'].date.hourOfDay天内小时数 (0-23)
doc['field_name'].date.millisOfDay天内的毫秒数(0-8639999)
doc['field_name'].date.minuteOfDay天内分钟数 (0-1439).
doc['field_name'].date.secondOfDay天内秒数 (0-86399).
doc['field_name'].date.minuteOfHour小时内分钟数 (0-59).
doc['field_name'].date.secondOfMinute分钟内秒数 (0-59).
doc['field_name'].date.millisOfSecond秒内的毫秒数(0-999)
doc['field_name'].date.year年 (-292000000 - 292000000).
doc['field_name'].date.yearOfCentury世纪内年份 (1-100).
doc['field_name'].date.yearOfEra时代内年份 (1-292000000).

以下示例显示日期字段date0和date1之间的年份差异:

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

geo_point field API

Expression说明
doc['field_name'].empty一个布尔值,指示字段在文档中是否没有值。
doc['field_name'].lon地理点的经度
doc['field_name'].lat地理点的纬度

以下示例计算距离华盛顿特区的公里数:

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

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

Limitations

与其他脚本语言相比,存在一些限制:

  • 只能访问数字、布尔值、日期和地理点字段
  • Stored fields不可用