表达式语法
问天引擎支持用户使用内置支持的运算符定制自己的算分公式,问天引擎支持的运算符如下所示:
运算 | 运算符 | 说明 |
一元运算 | - | 负号,功能为对某个表达式的值取负值,如-1, -max(width)。 |
算数运算 | +, -, *, / | 如width / 10 |
关系运算 | ==,!= ,>, <, >=, <= | 如width>=400 |
逻辑运算 | and ,or,! | 如width>=400 and height >= 300, !(a > 1 and b < 2) |
位运算 | &, |,^ | 如 3 & (price ^ pubtime) + (price | pubtime) |
条件运算 | if(cond, thenValue, elseValue) | 如果cond的值非0,则该if表达式的实际值为thenValue,否则为elseValue。如if(2, 3, 5)的值为3,if(0, 3, 5)的值为5。(注意:不支持字符串字段类型,如literal或text类型都不支持;取值范围为int32的取值范围) |
in 运算 | i in [value1, value2, …, valuen] | 如果i的值在集合[value1, value2, …, valuen]中出现,则该表达式值为1,否则为0。例如: 2 in [2, 4, 6]的值为1,3 in [2, 4, 6]的值为0。 |
在表达式中用户可以使用schema定义的属性字段、也可以使用内置的各种函数以及各种特征函数。
内置函数
函数 | 说明 |
max(a, b) | 取a和b的最大值。 |
min(a, b) | 取a和b的最小值。 |
ln(a) | 对a取自然对数。 |
log2(a) | 对a取以2为底的对数。 |
log10(a) | 对a取以10为底的对数。 |
sin(a) | 正弦函数。 |
cos(a) | 余弦函数。 |
tan(a) | 正切函数。 |
asin(a) | 反正弦函数 |
acos(a) | 反余弦函数 |
atan(a) | 反正切函数。 |
ceil(a) | 对a向上取整,如ceil(4.2)为5。 |
floor(a) | 对a向下取整,如floor(4.6)为4。 |
sqrt(a) | 对a开方,如sqrt(4)为2。 |
pow(a,b) | 返回a的b次幂,如pow(2, 3)为8。 |
now() | 返回当前时间,自Epoch (00:00:00 UTC, January 1, 1970)开始计算,单位是秒。 |
random() | 返回[0, 1]间的一个随机值。 |
特征函数
函数名称 | 描述 | 粗排 | 精排 |
静态文本相关性,用于衡量query与文档的匹配度 | 支持 | 不支持 | |
获取查询中用户指定的查询词权重最大值 | 支持 | 支持 | |
时效分,用于衡量文档的新旧程度 | 支持 | 支持 | |
时效分,用于衡量文档的新旧程度 | 支持 | 支持 | |
归一化函数,根据不同的算法将数值归一化至[0, 1] | 支持 | 支持 | |
获取两个点之间的球面距离,一般用于LBS的距离计算 | 支持 | 支持 | |
使用高斯函数,根据数值和给定的起始点之间的距离,计算其衰减程度 | 支持 | 支持 | |
使用线性函数,根据数值和给定的起始点之间的距离,计算其衰减程度 | 支持 | 支持 | |
使用指数函数,根据数值和给定的起始点之间的距离,计算其衰减程度 | 支持 | 支持 | |
获取查询串中kvpairs子句中指定字段的值 | 支持 | 支持 | |
判断字段值是否(不)在指定列表中 | 支持 | 支持 | |
用于对查询语句和文档做标签匹配,使用匹配结果对文档进行算分加权 | 支持 | 支持 | |
获取粗排表达式最终计算分值 | 不支持 | 支持 | |
关键词在字段上的文本匹配度 | 不支持 | 支持 | |
获取某字段上与查询词匹配的分词词组个数与该字段总词组个数的比值 | 不支持 | 支持 | |
获取查询词中(在某个字段上)命中词组个数与总词组个数的比值 | 不支持 | 支持 | |
用来表示关键词分词词组在字段上的紧密程度 | 不支持 | 支持 | |
获取某个字段上的分词词组个数 | 不支持 | 支持 | |
返回查询词分词后词组个数 | 不支持 | 支持 | |
获取查询词中(在某个字段上)命中文档的词组个数 | 不支持 | 支持 | |
获取文档中某个字段与查询词匹配的词组个数 | 不支持 | 支持 | |
查询词在某个字段上命中的分词词组个数与该词组在字段上最小窗口的比值 | 不支持 | 支持 |
排序表达式的使用
粗排表达式
在粗排中使用表达式需要在kvpairs中指定first_formula,内容为表达式,并且可以通过在config子句中设置rank_trace查看算分逻辑,例如:
config=start:0,hit:10,rank_trace:DEBUG,format:json&&query=default:'搜索'&&kvpairs=first_formula:price*0.1
精排表达式
在精排中使用表达式需要在kvpairs中指定formula,内容为表达式,并且可以通过在config子句中设置rank_trace查看算分逻辑,例如:
config=start:0,hit:10,rank_trace:DEBUG,format:json&&query=default:'搜索'&&kvpairs=formula:price*0.1
注意事项
参与粗排的文档数比较多,需要控制好粗排表达式的负责度,否则容易超时。
可以在一次查询中同时使用粗排和精排表达式。