運算式文法
召回引擎版支援使用者使用內建支援的運算子定製自己的算分公式,召回引擎版支援的運算子如下所示:
運算 | 運算子 | 說明 |
一元運算 | - | 負號,功能為對某個運算式的值取負值,如-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注意事項
參與粗排的文檔數比較多,需要控制好粗排運算式的複雜度,否則容易逾時。
可以在一次查詢中同時使用粗排和精排運算式。