Lucene 表达式语言
Elastic Stack Serverless
Lucene 的表达式将 javascript
表达式编译为字节码。 它们专为高性能自定义排名和排序函数而设计,并且默认情况下为 inline
和 stored
脚本启用。
表达式的设计目的是为了与自定义 Lucene 代码具有竞争性的性能。 这种性能归功于与其它脚本引擎相比,表达式具有较低的单文档开销:表达式执行更多“预先”操作。
这使得执行速度非常快,甚至比您编写 native
脚本还要快。
表达式支持 javascript 语法的子集:单个表达式。
有关可用运算符和函数的详细信息,请参阅表达式模块文档。
expression
脚本中的变量可用于访问
- 文档字段,例如
doc['myfield'].value
- 字段支持的变量和方法,例如
doc['myfield'].empty
- 传递到脚本中的参数,例如
mymodifier
- 当前文档的分数,
_score
(仅在script_score
中使用时可用)
您可以将表达式脚本用于 script_score
、script_fields
、排序脚本和数值聚合脚本,只需将 lang
参数设置为 expression
。
表达式 | 描述 |
---|---|
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
映射到 1
,false
映射到 0
。例如:doc['on_sale'].value ? doc['price'].value * 0.5 : doc['price'].value
日期字段被视为自 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
表达式 | 描述 |
---|---|
doc['field_name'].empty |
一个布尔值,指示该字段在文档中是否没有值。 |
doc['field_name'].lat |
geo 点的纬度。 |
doc['field_name'].lon |
geo 点的经度。 |
以下示例计算从华盛顿特区到目标位置的距离(以公里为单位)
haversin(38.9072, 77.0369, doc['field_name'].lat, doc['field_name'].lon)
在本例中,坐标可以作为参数传递给脚本,例如,基于用户的地理位置。
与其他脚本语言相比,存在一些限制
- 只能访问数值、
boolean
、date
和geo_point
字段 - 存储字段不可用