排序表达式

表达式语法

问天引擎支持用户使用内置支持的运算符定制自己的算分公式,问天引擎支持的运算符如下所示:

运算

运算符

说明

一元运算

-

负号,功能为对某个表达式的值取负值,如-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]间的一个随机值。

特征函数

函数名称

描述

粗排

精排

static_bm25

静态文本相关性,用于衡量query与文档的匹配度

支持

不支持

exact_match_boost

获取查询中用户指定的查询词权重最大值

支持

支持

timeliness

时效分,用于衡量文档的新旧程度

支持

支持

timeliness_ms

时效分,用于衡量文档的新旧程度

支持

支持

normalize

归一化函数,根据不同的算法将数值归一化至[0, 1]

支持

支持

distance

获取两个点之间的球面距离,一般用于LBS的距离计算

支持

支持

gauss_decay

使用高斯函数,根据数值和给定的起始点之间的距离,计算其衰减程度

支持

支持

linear_decay

使用线性函数,根据数值和给定的起始点之间的距离,计算其衰减程度

支持

支持

exp_decay

使用指数函数,根据数值和给定的起始点之间的距离,计算其衰减程度

支持

支持

kvpairs_value

获取查询串中kvpairs子句中指定字段的值

支持

支持

in/notin

判断字段值是否(不)在指定列表中

支持

支持

tag_match

用于对查询语句和文档做标签匹配,使用匹配结果对文档进行算分加权

支持

支持

first_phase_score

获取粗排表达式最终计算分值

不支持

支持

text_relevance

关键词在字段上的文本匹配度

不支持

支持

field_match_ratio

获取某字段上与查询词匹配的分词词组个数与该字段总词组个数的比值

不支持

支持

query_match_ratio

获取查询词中(在某个字段上)命中词组个数与总词组个数的比值

不支持

支持

fieldterm_proximity

用来表示关键词分词词组在字段上的紧密程度

不支持

支持

field_length

获取某个字段上的分词词组个数

不支持

支持

query_term_count

返回查询词分词后词组个数

不支持

支持

query_term_match_count

获取查询词中(在某个字段上)命中文档的词组个数

不支持

支持

field_term_match_count

获取文档中某个字段与查询词匹配的词组个数

不支持

支持

query_min_slide_window

查询词在某个字段上命中的分词词组个数与该词组在字段上最小窗口的比值

不支持

支持

排序表达式的使用

粗排表达式

在粗排中使用表达式需要在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

注意事项

  • 参与粗排的文档数比较多,需要控制好粗排表达式的负责度,否则容易超时。

  • 可以在一次查询中同时使用粗排和精排表达式。