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.centuryOfEra | 100年 (1-2920000) |
doc['field_name'].date.dayOfMonth | Day (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不可用