本地英文版地址: ../en/modules-scripting-expression.html
Lucene的表达式将javascript
表达式编译成字节码。
它们是为高性能定制 排名(ranking)和排序(sorting) 功能而设计的,默认情况下支持内联(inline
)和存储的(stored
)脚本。
性能
表达式被设计成具有与自定义Lucene代码相媲美的性能。 这种性能是因为与其他脚本引擎相比,每个文档的开销较低:表达式做了更多的“预先准备”。
这使得执行速度非常快,甚至比编写原生(native
)脚本还要快。
语法
表达式支持javascript语法的子集:单个表达式。
有关可用运算符和函数的详细信息,请参见表达式模块文档。
expression
脚本中的变量可用于访问:
-
文档的字段,比如:
doc['myfield'].value
-
字段支持的变量和函数,比如:
doc['myfield'].empty
-
传递给脚本的参数,比如
mymodifier
-
当前文档的得分
_score
(仅在script_score
中使用时有效)
可以将表达式脚本用于script_score
、script_fields
、排序脚本和数值聚合脚本,只需将参数lang
设置为expression
。
numeric字段API
表达式 | 描述 |
---|---|
|
字段的值,双精度( |
|
一个布尔值,指示该字段在文档中是否为空值。 |
|
该文档中值的数量。 |
|
该文档中字段的最小值。 |
|
该文档中字段的最大值。 |
|
该文档中字段值的中位数。 |
|
该文档中字段值的平均数。 |
|
该文档中字段值的总和。 |
当文档完全缺少该字段时,默认情况下,该值将被视为0
。
你也可以将其视为另一个值,例如 doc['myfield'].empty ? 100 : doc['myfield'].value
当文档的字段有多个值时,默认情况下返回最小值。
你也可以选择一个不同的值,例如 doc['myfield'].sum()
。
布尔(bool)字段显示为数字,true
映射为1
,false
映射为0
。
例如:doc['on_sale'].value ? doc['price'].value * 0.5 : doc['price'].value
date字段API
date字段被视为自1970年1月1日以来的毫秒数,并支持上述numeric字段API,以及对某些特定的日期字段的访问:
表达式 | 描述 |
---|---|
|
世纪 (1-2920000) |
|
天 (1-31),比如 |
|
星期几 (1-7),比如 |
|
一年中的某一天,比如 |
|
纪元, |
|
小时(0-23)。 |
|
一天中的毫秒数(0-86399999)。 |
|
一秒内的毫秒(0-999)。 |
|
一天中的分钟(0-1439)。 |
|
一小时内的分钟(0-59). |
|
一年中的月数(1-12),比如 |
|
一天中的秒数(0-86399) |
|
一分钟内的描述(0-59) |
|
年(-292000000 - 292000000) |
|
一个世纪中的年数(1-100) |
|
一个纪元中的年(1-292000000) |
下面这个例子显示了date
字段 date0 和 date1 之间的年份差异:
doc['date1'].date.year - doc['date0'].date.year
geo_point
字段API
表达式 | 描述 |
---|---|
|
一个布尔值,指示该字段在文档中是否为空值。 |
|
地理位置坐标点的纬度值 |
|
地理位置坐标点的经度值 |
下面这个例子计算与华盛顿市区的距离(单位为公里):
haversin(38.9072, 77.0369, doc['field_name'].lat, doc['field_name'].lon)
在这个例子中,坐标可以作为参数传递给脚本,例如基于用户的地理位置。
局限性
相对于其他脚本语言有一些限制:
- 只能访问 numeric、boolean、date 及 geo_point 字段
- 存储(的)字段不可用