Lucene表达式语言
editLucene表达式语言
editLucene的表达式将一个javascript
表达式编译为字节码。它们被设计用于高性能的自定义排名和排序功能,并且默认情况下为inline
和stored
脚本启用。
性能
edit表达式旨在与自定义Lucene代码具有竞争力的性能。 这种性能是由于每个文档的开销较低,与其他脚本引擎相比:表达式在“前期”做得更多。
这使得执行速度非常快,甚至比您编写的native
脚本还要快。
语法
edit表达式支持JavaScript语法的一个子集:单个表达式。
有关可用运算符和函数的详细信息,请参阅表达式模块文档。
在expression
脚本中的变量可供访问:
-
文档字段,例如
doc['myfield'].value
-
字段支持的变量和方法,例如
doc['myfield'].empty
-
传递到脚本的参数,例如
mymodifier
-
当前文档的得分,
_score
(仅在使用script_score
时可用)
您可以使用表达式脚本进行 script_score
、script_fields
、排序脚本和数值聚合脚本,只需将 lang
参数设置为 expression
。
数值字段 API
editExpression | Description |
---|---|
|
该字段的值,作为一个 |
|
一个布尔值,指示该字段在文档中没有值。 |
|
此文档中的值的数量。 |
|
该文档中字段的最小值。 |
|
该文档中字段的最大值。 |
|
该文档中字段的中位数值。 |
|
此文档中值的平均值。 |
|
此文档中值的总和。 |
当文档完全缺少该字段时,默认情况下该值将被视为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
日期字段 API
edit日期字段被视为自1970年1月1日以来的毫秒数,并支持上述数值字段API,以及访问一些特定于日期的字段:
Expression | Description |
---|---|
|
世纪 (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
editExpression | Description |
---|---|
|
一个布尔值,指示该字段在文档中没有值。 |
|
地理点的纬度。 |
|
地理点的经度。 |
以下示例计算从华盛顿特区到目的地的距离(以公里为单位):
haversin(38.9072, 77.0369, doc['field_name'].lat, doc['field_name'].lon)
在这个例子中,坐标可以作为参数传递给脚本,例如基于用户的地理位置。
限制
edit相对于其他脚本语言,存在一些限制:
-
仅数字、
布尔
、日期
和地理点
字段可以被访问 - 存储字段不可用