閱讀886 返回首頁    go 魔獸


搜索相關性函數__應用高級配置_產品使用手冊_開放搜索-阿裏雲

插件function可以用在filter子句作為過濾和篩選條件,而返回值為數值型的fuction在sort子句中,用來做排序。其中函數參數出現的文檔字段必須配置為屬性字段

功能feature可以用到排序表達式中(出於性能的考慮,大部分僅支持精排表達式),可以通過各種語法及語句的組合得到強大的排序功能。其中函數參數出現的文檔字段必須勾選可搜索.

兼容特征及函數項

兼有function及feature的功能,可以同時在filter、sort及formula表達式中使用。其中函數參數出現的文檔字段必須配置為屬性字段

distance : 獲取兩個點之間的球麵距離。一般用於LBS的距離計算。

  1. 詳細用法
    distance(longitude_a, latitude_a, longtitude_b, latitude_b, output_name)

  2. 參數
    longitude_a:點A的經度值。支持的參數類型為浮點型的字段名
    latitude_a:點A的緯度值。支持的參數類型為浮點型的字段名
    longtitude_b:點B的經度值。支持的參數類型為浮點型的字段名;或者為用戶查詢串中kvpairs子句中設置的一個字段名(其值需要為浮點數)
    latitude_b:點B的緯度值。支持的參數類型為浮點型的字段名;或者為用戶查詢串中kvpairs子句中設置的一個字段名(其值需要為浮點數)
    outputname:如果需要在結果中返回距離值,可以通過製定outputname值得到,如果不需要,可以不指定。

  3. 返回值
    float。實際距離值,單位為千米。

  4. 適用場景
    場景1:查找距離用戶(120.34256,30.56982)10公裏內的外婆家(lon,lat為文檔中記錄商家的經緯度值,需要配置為屬性字段),並按照距離由近及遠排序;
    query=default:’外婆家’&&filter=distance(lon,lat,”120.34256”,”30.56982”)<10&&sort=+distance(lon,lat,"120.34256","30.56982") 其中距離排序也可以采用如下方式實現,用戶坐標通過kvpairs傳遞。
    kvpairs=longtitude_in_query:120.34256, latitude_in_query:30.56982
    精排表達式為:distance(longitude_in_doc, latitude_in_doc, longtitude_in_query, latitude_in_query, distance_value)

  5. 注意事項

    • outputname參數僅限於精排表達式中使用,filter及sort子句不支持。設置outputname參數後,實際的距離值將展示到variableValue節點中,該節點隻能在返回格式為xml或者fulljson中(config子句中format參數可以設置)才能得到。

tag_match : 用於對查詢語句和文檔做標簽匹配,使用匹配結果對文檔進行算分加權

  1. 場景概述
    涉及query和文檔匹配的很多需求都可以使用或者轉化為tag_match來滿足,對實現搜索個性化需求尤其有用。例如優先出現用戶點讚過的店鋪優先出現,有限展現用戶喜歡的體育和娛樂類新聞等。tag_match最基本的功能是在文檔的某個ARRAY字段中存儲一係列的key-value信息。然後在查詢query中通過kvpairs子句傳遞對應的key-value信息,tag_match就會去文檔中尋找查詢query中的key, 然後為每個匹配的key計算得到一個分數,再合並所有匹配的key的分數得到一個最終分。這個結果就可以用來做算分加權或者過濾。

    計算過程如下:

  2. 詳細用法
    常見用法:
    tag_match(query_key, doc_field, kv_op, merge_op)
    高級用法:
    tag_match(query_key, doc_field, kv_op, merge_op, has_default, doc_kv, max_kv_count)

  3. 參數
    query_key:指定查詢語句中用於匹配的字段key-value值,該字段需要通過kvpairs子句傳遞,key與value通過英文等號‘=’分隔,多個key-value通過英文冒號‘:’分隔,如:
    kvpairs=query_tags:10=0.67:960=0.85:1=48//表示參數query_tags中包含3個元素:10、960、1,其對應的value分別是:0.67、0.85、48。其中query也可以隻為key的列表,如:kvpairs=cats:10:960:1。

    doc_field:指定文檔中存儲key-value的字段名,該字段為整型或者浮點型的數組類型(如果是浮點型數組,則key的值匹配的時強轉當int64來處理)。數組的奇數位置是key,下一個相鄰的偶數位置為key的value。即 [key0 value0 key1 value1 …]

    kv_op:當query_key中的值與doc_field中的key匹配時對二者的value所采取的操作,目前支持的操作符如下:max(最大值)、min(最小值)、sum(求和)、avg(平均數)、mul(乘積)、query_value(query_key中該key對應的value值)、doc_value(文檔中該key對應的value值)、number(常數)。

    merge_op:多個key匹配後會產生多個結果,merge_op指定了將這些結果進行如何操作,目前支持的操作類型如下:max(最大值)、min(最小值)、sum(求和)、avg(平均值)、null(取第一個kv_op的計算結果,忽略其他結果)。

    has_default:默認是false,表示不啟動初始分值;為true時說明doc_field的第一個值為默認值,[init_score k0 v0 k1 v1…]。(類似base分值的概念)

    doc_kv:默認是true。表明doc_field字段中的值是以key-value對的形式存在;為false則表示doc_field中隻包含key信息,這種場景對doc需要存儲標簽,但是標簽沒有權重很方便。

    max_kv_count:因為查詢中的key-value結構需要通過query傳遞,所有tag_match對query中能傳遞多少key-value有限製。默認為50,可以通過這個參數將這個限製調大,但是最大不能超過5120。

  4. 返回值
    double,返回具體的分值,如果has_default為false並且沒有配額的內容則為0.如果需要返回int64的結果,需要使用int_tag_match,該函數功能與參數與int_tag_match完全一致,但int_tag_match不能在排序表達式中使用。

  5. 適用場景
    場景1:一個大型的綜合性論壇,帖子可以被打上各種各樣的標簽(搞笑,體育,新聞,音樂,科普..)。我們在推送給open_search的文檔中,可以為每個標簽賦予一個標簽id(例如搞笑-1, 體育-5, 新聞-3, 音樂-6..), 然後通過一個tag字段存儲這些標簽。 如果我們對帖子做過預處理,甚至能得到每個帖子每個標簽的權重,例如一個搞笑體育新聞的帖子可以得到搞笑的權重為0.5,體育的權重為0.5,新聞權重為0.1,則這個帖子的tag字段的值為[1 0.5 5 0.5 3 0.1]對會員用戶,通過長時間的積累,我們能獲知每個用戶的興趣標簽。
    例如用戶nba_fans對體育和搞笑很感興趣,他對應的體育和搞笑標簽的權重分別為0.6和0.3。那麼這個用戶查詢時,我們就可以通過kv_pairs子句把這個信息加到query裏麵。假如這個kv_pairs子句名字為user_tag, 那麼nba_fans的user_tag的值5=0.6:1=0.3。這樣,我們隻要在精排表達式中配置了tag_match(user_tag, tag, mul, sum), 我們就能夠實現對用戶感興趣的帖子加權,把用戶更感興趣的帖子排到前麵。

    例如nba_fans搜索到上麵那個帖子時,搞笑和體育這兩個標簽能夠匹配到。通過指定kv_op參數為mul,我們會把query和doc中的值相乘,他們各自的計算分數分別為(體育:0.5 * 0.6 = 0.3, 搞笑:0.5 * 0.3 = 0.15)。通過指定merge_op參數為sum,我們會把體育和搞笑的分數加和(0.3+0.15 = 0.45),這個加和的分數會加到最終的排序分數上。這樣,我們就能夠實現了對這個用戶感興趣帖子的排序加權。

    場景2:商品可以具有多個屬性標簽,如1表示年輕人(年齡)、2表示中年人(年齡)、3表示小清新(風格)、4表示時尚(風格)、5表示女性(性別)、6表示男性(性別)等。
    假設我們隻想表示商品有沒有某個標簽,不想區分哪個標簽更重要。這個標簽通過options字段來保存。那麼年輕時尚女性的衣服的options字段可以表示為[1 4 5], 注意這裏隻有標簽key,沒有value。用戶也都有自己的屬性標簽,和商品標簽對應。例如年輕女性用戶,曆史成交中多購買小清新風格衣服。這該用戶的查詢可以寫為user_options=1:3:5。注意這裏kv_pair中也是隻有標簽key,沒有value的。

    要實現對符合用戶標簽喜好的商品加權,我們可以在formula中使用tag_match(user_options, options, 10, sum, false, false)。這裏我們通過user_options和options指定了query和doc的標簽信息。kv_op設為常數10,表示隻要有標簽匹配到,那麼匹配的計算結果就是10。has_default為false,表示我們不需要初始值。doc_kv為false,表示我們doc中隻存儲了key信息,沒有value。

    這樣,上麵的年輕女用戶查詢到上麵的衣服時,女性和年輕兩個標簽能夠匹配上,這兩個標簽的計算結果都是10。通過sum這個merge_op,能夠得到這件商品的最終加權分數為20。通過這種方式,即使我們沒有標簽的權重信息,也能夠實現對匹配到的文檔做排序加權。

  6. 注意事項

    • 如果是用在filter或者sort子句中,則query_key、kv_op、merge_op、has_default、doc_kv必須使用雙引號括起來,如:sort=-tag_match(“user_options”, options, “mul”, “sum”, “false”, “true”, 100)。
    • tag_match的key匹配都是通過整數比較來完成的。因此query和doc中的key都應該轉換為整數形式,如果是浮點類型,tag_match在比較時,會強製轉換為整數類型

函數function項

插件function可以用在filter子句作為過濾和篩選條件,而返回值為數值型的fuction在sort子句中,用來做排序。其中函數參數出現的文檔字段必須配置為屬性字段

in/notin : 判斷字段值是否(不)在指定列表中

  1. 詳細用法
    in(field, “number1|number2”)
    notin(field, “number1|number2”)

  2. 參數
    field:要判斷的字段名,隻支持INT及FLOAT類型,ARRAY及LITERAL、TEXT、模煳分詞係列類型不支持
    number列表:集合元素,多個值用’|’分隔,參數以字符串形式傳入

  3. 返回值
    true/false

  4. 適用場景
    場景1:查詢文檔中包含“iphone”且type(int32類型)為1或2或3的文檔;
    query=default:’iphone’&&filter=in(type, “1|2|3”)

    場景2:查詢文檔中包含“iphone”且type(int32類型)不為1或2或3的文檔;
    query=default:’iphone’&&filter=notin(type, “1|2|3”)

  5. 注意事項

    • in(field, “number1|number2”)函數也等價於(field = number1) OR (field = number2),但是前者的性能會更好,同理notin也類似。

fieldlen : 獲取literal類型字段長度

  1. 詳細用法
    fieldlen(field_name)

  2. 參數
    field_name:要判斷的字段名,可以為literal或者array類型。

  3. 返回值
    字段內容長度,類型為int64。如果字段為array類型,則返回數組元素個數。

  4. 適用場景
    場景1:返回用戶名usr_name不為空的文檔
    query=default:’關鍵詞’&&filter=fieldlen(usr_name)>0

in_polygon : 判斷某個點是否在某個多邊形範圍內,一般用於配送範圍判斷

  1. 詳細用法
    in_polygon(polygon_field, user_x_coordinate, user_y_coordinate, has_multi_polygons=”false”)

  2. 參數
    polygon_field: 表示商家配送範圍的字段名,類型必須為DOUBLE_ARRAY, 字段值依次為配送多邊形有序定點的x,y坐標(先x後y),頂點務必保證有序(順時針、逆時針均可)!!如果有多個(N個)配送多邊形,則第一個值表示多邊形個數,第2~N+1的值表示後續每個多邊形的頂點數(不是坐標數哦!!),第N+2值開始依次表示各多邊形的頂點x,y坐標(N的值域為[1,50]
    user_x_coordinate: 用戶的x坐標, double類型
    user_y_coordinate: 用戶的y坐標, double類型
    has_multi_polygons:表示polygon_filed是否包含多個獨立的多邊形需要判斷。默認為false,表示隻有單一的多邊形。

  3. 返回值
    int,在多邊形內返回第幾個多邊形匹配, 否則返回0。

  4. 適用場景
    場景1:判斷用戶是否在商家的配送範圍。如商家配送範圍的字段為coordinates, 用戶位置坐標為 (120.307234, 39.294245),則過濾在配送範圍內的商家查詢可寫為:
    query=default:’美食’&&filter=in_polygon(coordinates, 120.307234, 39.294245)>0

  5. 注意事項

    • 最多支持50個多邊形,超過則跳過該文檔的計算;
    • 不支持有孔多邊形,如環;
    • 不支持多個分離部分的多邊形;
    • 坐標個數為0,表示沒有坐標,返回0;
    • 坐標個數為奇數個,則認為數據有誤,返回0;
    • 用戶點位於多邊形邊上,則認為匹配成功,返回為1(或具體多邊形下標)。
    • 多邊形插件計算量較大,對查詢性能有影響,建議盡量控製頂點個數,具體值請根據自己實際情況進行測試得出。

in_query_polygon : 判斷文檔中指定的點是否在用戶指定的多邊形範圍內

  1. 詳細用法
    in_query_polygon(polygon_key, doc_point)

  2. 參數
    polygon_key:kvpairs子句中定義的用戶參數key,多邊形頂點存儲在對應的value中。類型必須為DOUBLE_ARRAY,字段值依次為配送多邊形有序定點的x,y坐標(先x後y),頂點務必保證有序(順時針、逆時針均可)!!坐標之間用逗號分隔,格式為:xA,yA,xB,Yb。支持多個多邊形,多邊形與多邊形之間通過分號(;)分隔。doc_point:類型必須為DOUBLE_ARRAY,表示需要判斷的點。隻包含兩個值,依次為點的x,y坐標

  3. 返回值
    int,返回匹配到的第一個多邊形的下標,沒有匹配則返回0

  4. 適用場景
    場景1:搜索銀泰商圈(xA,yA,xB,Yb,xC,Yc;xD,yD,xE,yE,xF,yF,xG,yG)的外婆家,商家位置存放在point字段中
    query=default:’外婆家’&&filter=in_query_polygon(“polygons”, point)>0&&kvpairs=polygons:xA,yA,xB,Yb,xC,Yc;xD,yD,xE,yE,xF,yF,xG,yG

multi_attr : 返回數組字段指定位置的值

  1. 詳細用法
    multi_attr(field, pos, default_value=0|””)

  2. 參數
    field: 查詢的字段名,必須為ARRAY數組類型,且必須配置為屬性字段
    pos: 整形常數或整形字段,需要配置為屬性字段,,下標從0開始
    default_value: 可選,字符串常量。表示如果指定pos的值不存在時,返回default_value

  3. 返回值
    類型和field保持一致

  4. 適用場景
    場景1:商品有多個價格[市場價、折扣價、銷售價],存到prices字段中。查詢銷售價小於1000的手機 query=deault:’手機’&&filter=multi_attr(price,2)<1000

bit_struct: 將INT_ARRAY字段值進行自定義分組並允許對分組值進行指定operation計算

  1. 詳細用法
    bit_struct(doc_field, “$struct_definition”, operation, …)

  2. 參數
    doc_field: 是一個INT64_ARRAY類型的字段名。

    “$struct_definition”:用於把int64的值拆分成多個維度的信息。每一維的分組用int64中的起始bit位置和結束bit位置指定,使用橫線“-”分隔,bit位置從值的高端開始算起,從0開始,最大不能超過63。多個分組用逗號”,”分隔。每個分組有一個編號,編號從1開始算起。
    舉例:假設用戶需要把int64拆分成3個維度的信息, bit0到bit9代表一個值(用$1表示), bit10到bit48代表一個值(用$2表示), bit49到bit60代表一個值(用$3表示), 則該參數可寫成: ”0-9,10-48,49-60”。

    operation:定義計算過程,最少定義1個,最多定義5個,每個operation會有一個編號,這個編號是接著struct_definition中的編號開始遞增,當需要定義多個operation時,後麵的operation要用到前麵計算過的operatoin的返回值,這時候就可以用到給operation分配的編號了。
    operation 可以定義的操作有:
    “equal,$m,$n”: 判斷$m代表的值和$n代表的值是否相等,相等返回true,否則返回false。
    “overlap,$m,$n,$k,$p”:判斷($m,$n)和($k,$p)定義的範圍在數軸上是否相交。相交時返回true,否則返回false
    “and,$m,$n,…”:返回$m, $n,..等做and(&&)的結果。
    注:上麵的這3個操作的參數也可以是整數數字。 例如 “equal,$1,1”

  3. 返回值
    int64,返回最後一個operation第一次為true時對應的doc_field中的數組下標(從0開始)。若doc_field中沒有滿足operation指定的要求的值,則返回-1。

  4. 場景舉例

    • 查詢給定時間段在營業的店鋪有哪些
      假定用戶文檔中有一個int64_array類型的字段open_time,每個值表示一段營業時間,將int64的高32位表示起始時間,低32位表示結束時間,如果要查詢下午14點到15:30點營業的店鋪,可以將時間轉換為從當天0點開始,按分鍾為單位的時間段, 則下午14點到15:30表示為(840,930),則查詢中filter子句可以寫為:
      filter=bit_struct(open_time, “0-31,32-63”,”overlap,$1,$2,840,930”)!=-1

    • 查詢未來某一天,某個餐點(早,中,晚),可以提供Pmin到Pmax人數就餐的店鋪
      假設用戶文檔中有一個int64_array類型的字段book_info,對於該字段中的一個值,0-7位表示日期,8-15位餐點,16-41位表示最小人數,42-63位表示最大人數。查詢明天(用1表示)晚上(用3表示)能服務3-5個人的店鋪,則filter子句可以寫為:
      filter=bit_struct(book_info,”0-7,8-15,16-41,42-63”,
      “equal,$1,1”,”equal,$2,3”,”overlap,$3,$4,3,5”,”and,$5,$6,$7”)!=-1
      這裏$1表示book_info中0-7位代表的值,
      $2表示book_info中8-15位代表的值
      $3表示book_info中16-41位代表的值
      $4表示book_info中42-63位代表的值
      $5代表operation “equal,$1,1”的返回值
      $6代表 operation”equal,$2,3”的返回值
      $7代表operation “overlap,$3,$4,3,5”的返回值
      返回$5,$6,$7代表的值做and(邏輯與)後第一次為true時候的值 在book_info中對應的數組下標

    • 查詢下午14點到15:30表示為(840,930)之間,庫存>10的店鋪有哪些?
      因為bit_struct返回的是下標,所以他可以和multi_attr函數一起配合使用,取另外一個array類型字段對應下標的值。如該例,可以在查詢語句中使用:
      filter=multi_attr(store, bit_struct(dispatch_time,”0-31,32-63”, “equal,$1,840”, “equal,$2,930”, “and,$3,$4”))>10
      dispatch_time是文檔中有一個多值INT64的字段,用於存儲商戶的配送時間。將時間轉換為從當天0點開始,按分鍾為單位的時間段, 則下午14點到15:30表示為(840,930)
      store是一個int64_array字段,與dispatch_time的時間段分別對應,表示該時間段的庫存量。

  5. 注意事項

特征feature項

功能feature可以用到排序表達式中(大部分僅支持精排表達式),可以通過各種語法及語句的組合得到強大的排序功能。其中函數參數出現的文檔字段必須勾選可搜索.

static_bm25 : 靜態文本相關性,用於衡量query與文檔的匹配度

  1. 詳細用法
    static_bm25()

  2. 參數

  3. 返回值
    float,值域為[0,1]

  4. 適用場景
    場景1:在粗排中指定文本分;
    在粗排表達式中指定static_bm25()

  5. 注意事項

    • 可以用在粗排表達式

timeliness : 時效分,用於衡量文檔的新舊程度

  1. 詳細用法
    timeliness(pubtime)

  2. 參數
    pubtime:要評估的字段,類型必須為int32或int64,單位為秒。

  3. 返回值
    float,值域為[0,1],值越大表示時效性越好。若大於當前時間則返回0。

  4. 適用場景
    場景1:在精排中指定create_timestamp字段的時效性;
    在粗排表達式中指定timeliness(create_timestamp)

  5. 注意事項

    • pubtime字段必須配置為屬性字段;
    • 可以用在粗排和精排表達式。

timeliness_ms : 時效分,用於衡量文檔的新舊程度

  1. 詳細用法
    timeliness_ms(pubtime)

  2. 參數
    pubtime:要評估的字段,類型必須為int32或int64,單位為毫秒。

  3. 返回值
    float,值域為[0,1],值越大表示時效性越好。若大於當前時間則返回0。

  4. 適用場景
    場景1:在精排中指定create_timestamp字段的時效性;
    在粗排表達式中指定timeliness_ms(create_timestamp)

  5. 注意事項

  • pubtime字段必須配置為屬性字段;
  • 可以用在粗排和精排表達式

normalize :歸一化函數,根據不同的算分將數值歸一化至[0, 1]

  1. 場景概述
    相關性計算過程中,一篇doc的好壞需要從不同的維度衡量。而各個維度的分數值域可能不同,比如網頁點擊數可能是成百上千萬,網頁的文本相關性分數在[0, 1]之間,它們之間沒有可比性。為了在公式中使用這些元素,需要將不同的分數歸一化至同一個值域區間,而normalize為這種歸一化提供了一種簡便的方法。normlize支持三種歸一化方法:線性函數轉化、對數函數轉化、反正切函數轉化。根據傳入參數的不同,normalize自動選擇不同的歸一化方法。如果隻指定value參數,normalize使用反正切函數轉化,如果指定了value和max參數,normalize使用對數函數轉化,如果指定了value、max和min,normalize使用線性函數轉化。

  2. 詳細用法:
    normalize(value, max, min)

  3. 參數
    value:需要做歸一化的值,支持double類型的浮點數,該值可以來自文檔中的字段或者其他表達式
    max:value的最大值,可選,支持double類型的浮點數
    min:value的最小值,可選,支持double類型的浮點數

  4. 返回值
    double,[0, 1]之間的值。

  5. 適用場景
    場景1:對price字段做歸一化,但是不知道price的值域,可以使用如下公式進行歸一化
    normalize(price)

    場景2:對price字段做歸一化,但是隻知道price的最大值為100,可以使用如下公式進行歸一化
    normalize(price, 100)

    場景3:對price字段做歸一化,並且知道price的最大值為100,最小值為1,可以使用如下公式進行歸一化
    normalize(price, 100, 1)

    場景4:將distance函數的結果歸一化至[0, 1]
    normalize(distance(longitude_in_doc, latitude_in_doc, longtitude_in_query, latitude_in_query))

  6. 注意事項

    • 使用反正切函數進行歸一化時,如果value小於0,歸一化後的值為0
    • 使用對數函數進行歸一化時,max的值要大於1
    • 使用線性函數進行歸一化時,max要大於min

gauss_decay,使用高斯函數,根據數值和給定的起始點之間的距離,計算其衰減程度

  1. 詳細用法
    gauss_decay(origin, value, scale, decay, offset)

  2. 參數
    origin:衰減函數的起始點,支持double類型的浮點數
    value:需要計算衰減程度的值,支持double類型的浮點數,該值可以來自用戶字段或者其他表達式
    scale:衰減程度,支持double類型的浮點數
    decay:當距離為scale時的衰減程度,支持double類型的浮點數,可選,默認值為0.000001
    offset:當距離大於offset時才開始計算衰減程度,支持double類型的浮點數,可選,默認值為0

  3. 返回值
    返回值為double,區間為[0, 1]

  4. 適用場景
    場景1:查找距離用戶最近的酒店,按照距離由近到遠排序,並且認為距離小於100m的酒店不用做區分, longitude_in_doc和latitude_in_doc為酒店的經緯度,longtitude_in_query和latitude_in_query為用戶的經緯度
    gauss_decay(0, distance(longitude_in_doc, latitude_in_doc, longtitude_in_query, latitude_in_query), 5, 0.000001, 0.1)

    場景2:查找2000元左右的手機,並且如果價格小於1500或者大於2500時,文檔算分為0,文檔中手機價格為price,kvpairs=price_key:2000,公式如下:
    gauss_decay(kvpairs_value(price_key, FLOAT), price, 500)

  5. 注意事項

    • 如果scale小於或者等於0,衰減函數默認返回0
    • 如果decay大於或者等於1,衰減函數默認返回1
    • 如果decay小於或者等於0,默認將decay設置為0.000001
    • 如果offset小於0,默認將offset設置為0

exp_decay,使用指數函數,根據數值和給定的起始點之間的距離,計算其衰減程度

  1. 詳細用法
    exp_decay(origin, value, scale, decay, offset)

  2. 參數
    origin:衰減函數的起始點,支持double類型的浮點數
    value:需要計算衰減程度的值,支持double類型的浮點數,該值可以來自用戶字段或者其他表達式
    scale:衰減程度,支持double類型的浮點數
    decay:當距離為scale時的衰減程度,支持double類型的浮點數,可選,默認值為0.000001
    offset:當距離大於offset時才開始計算衰減程度,支持double類型的浮點數,可選,默認值為0

  3. 返回值
    返回值為double,區間為[0, 1]

  4. 適用場景
    同gauss_decay,隻是衰減算法不同

  5. 注意事項

    • 如果scale小於或者等於0,衰減函數默認返回0
    • 如果decay大於或者等於1,衰減函數默認返回1
    • 如果decay小於或者等於0,默認將decay設置為0.000001
    • 如果offset小於0,默認將offset設置為0

linear_decay,使用指數函數,根據數值和給定的起始點之間的距離,計算其衰減程度

  1. 詳細用法
    linear_decay(origin, value, scale, decay, offset)

  2. 參數
    origin:衰減函數的起始點,支持double類型的浮點數
    value:需要計算衰減程度的值,支持double類型的浮點數,該值可以來自用戶字段或者其他表達式
    scale:衰減程度,支持double類型的浮點數
    decay:當距離為scale時的衰減程度,支持double類型的浮點數,可選,默認值為0.000001
    offset:當距離大於offset時才開始計算衰減程度,支持double類型的浮點數,可選,默認值為0

  3. 返回值
    返回值為double,區間為[0, 1]

  4. 適用場景
    同gauss_decay,隻是衰減算法不同

  5. 注意事項

    • 如果scale小於或者等於0,衰減函數默認返回0
    • 如果decay大於或者等於1,衰減函數默認返回1
    • 如果decay小於或者等於0,默認將decay設置為0.000001
    • 如果offset小於0,默認將offset設置為0

exact_match_boost :獲取查詢中用戶指定的查詢詞權重最大值

  1. 詳細用法
    exact_match_boost()

  2. 參數

  3. 返回值
    int,值域為[0, 99]

  4. 適用場景
    場景1:查詢為query=default:’開放搜索’^60 OR default:’opensearch’^50,希望按照實際匹配詞boost權重來排序。如如果文檔A包含“開放搜索”,文檔B包含“opensearch”,則文檔A排到文檔B前麵。
    粗排表達式為:exact_match_boost() 精排表達式為空。 //精排為空,默認按照粗排表達式分值來排序。

  5. 注意事項

    • 如果對於沒有指定boost的查詢詞默認boost值為99。

first_phase_score : 獲取粗排表達式最終計算分值

  1. 詳細用法
    first_phase_score()

  2. 參數

  3. 返回值
    float

  4. 適用場景
    場景1:粗排表達式為exact_match_boost(),精排為exact_match_boost()與text_relevance(title),且二者權重為3:1。
    粗排表達式:exact_match_boost()
    精排表達式:first_phase_score()*0.01*3+text_relevance(title) //直接使用first_phase_score()而exact_match_boostce()可以減少計算量,提高檢索性能。

  5. 注意事項

    • 多個OR查詢情況下,OR個數及查詢召回文檔數都對性能影響很大,需要根據實際場景進行詳細的測試和優化。

text_relevance : 關鍵詞在字段上的文本匹配度。

  1. 詳細用法
    text_relevance(field_name)

  2. 參數
    field_name:字段名,該字段需要為中文基礎分詞、中文基礎分詞、自定義分詞、單字分詞等類型,並且配置了索引字段。

  3. 返回值
    float,值域為[0,1]

  4. 適用場景
    場景1:在精排中對title和body進行文本算分,權重比為3:1
    text_relevance(title)*3+text_relevance(body)

  5. 注意事項

    • 主要衡量角度:命中詞在query中所占比重;命中詞在字段中所占比重;命中詞在字段中出現的頻率;字段中命中詞之間的順序關係與query中命中詞之間的順序關係。
    • 該feature目前隻用於精排排序。

fieldterm_proximity : 用來表示關鍵詞分詞詞組在字段上的緊密程度

  1. 詳細用法
    fieldterm_proximity(field_name)

  2. 參數
    field_name:該字段需要為TEXT、中文基礎分詞、自定義分詞、單字分詞等類型,並且建立了可搜索

  3. 返回值
    float,值域為[0,1]

  4. 適用場景
    場景1:在精排階段計算query在title和body的緊密度,並且title字段的緊密度在排序中起主導作用,則在創建精排公式時公式內容可以寫為:
    fieldterm_proximity(title)*10 + fieldterm_proximity(body)

  5. 注意事項

    • 主要衡量角度:命中詞在字段中的距離,命中詞在字段中的相互順序。
    • 該feature目前隻用於精排排序,且包含在text_relevance()中,即普通場景下二者無需共用。

kvpairs_value : 獲取查詢串中kvpairs子句中指定字段的值

  1. 詳細用法
    kvpairs_value(query_key, type)

  2. 參數
    query_key:要返回的kvpairs子句中的字段名type:kvpairs中query_key字段值的類型,目前支持的類型如下:INT,FLOAT,DOUBlE。

  3. 用法示例
    場景1:查詢串中kvpairs子句中設置了query_key:10,10是整數類型,期望公式中取出query_key的value,公式可以寫為:
    kvpairs_value(query_key, INT)

    場景2:查詢串中kvpairs子句中設置了query_key:10.1, 10.1是float類型,期望公式中取出query_key的value,公式可以寫為:
    kvpairs_value(query_key, FLOAT)

    場景3:查詢串中kvpairs子句中設置了query_key:10.12, 10.12是double類型,期望公式中取出query_key的value,公式可以寫為:
    kvpairs_value(query_key, DOUBLE)

query_term_count : 返回查詢詞分詞後詞組個數

  1. 詳細用法:
    query_term_count()

  2. 參數:

  3. 返回值:
    int

  4. 適用場景:
    場景1:根據查詢詞中term的個數做不同的處理; if (query_term_count() > 10, 0.5, 1)

  5. 注意事項:

  • 僅用於精排表達式

query_term_match_count :獲取查詢詞中(在某個字段上)命中文檔的詞組個數

  1. 詳細用法:
    query_term_match_count(field_name)

  2. 參數:
    field_name: 非必選參數,要統計的字段名,該字段類型可以是TEXT、中文基礎分詞、自定義分詞、單字分詞、英文分詞、模煳分詞類型,並且配置了索引字段。若不指定該參數,則默認返回全部字段命中的詞組個數。

  3. 返回值:
    int

  4. 適用場景:
    場景1:根據查詢詞在文檔中title字段上命中的詞組個數做不同的處理;
    if (query_term_match_count(title) > 10, 0.5, 1)

    場景2:根據查詢詞中命中的詞組個數做不同的處理;
    if (query_term_match_count() > 10, 0.5, 1)

  5. 注意事項:

  • 可以用於精排表達式
  • 統計的時查詢詞中命中的分詞詞組個數,重複的詞組會計算多次

field_term_match_count :獲取文檔中某個字段與查詢詞匹配的詞組個數

  1. 詳細用法:
    field_term_match_count(field_name)

  2. 參數:
    field_name: 要統計的字段名,該字段類型可以是TEXT、中文基礎分詞、自定義分詞、單字分詞、英文分詞、模煳分詞類型,並且配置了索引字段。

  3. 返回值:
    int

  4. 適用場景:
    場景1:根據字段中匹配的分詞詞組的個數做不同的處理
    if (field_term_match_count(title) > 5, 0.8, 0.6)

  5. 注意事項:

  • 可以用於精排表達式
  • 統計的是字段中命中的分詞詞組的個數,重複的詞組會計算多次

query_match_ratio :獲取查詢詞中(在某個字段上)命中詞組個數與總詞組個數的比值

  1. 詳細用法:
    query_match_ratio(field_name)

  2. 參數:
    field_name, 非必選參數,要統計字段名,該字段需要為TEXT、中文基礎分詞、自定義分詞、單字分詞、英文分詞、模煳分詞類型,並且配置了索引字段

  3. 返回值:
    float,值域為[0, 1]

  4. 適用場景:
    場景1:判斷查詢詞中的詞組是否全部命中文檔
    if (query_match_ratio() > 0.999, 1, 0)

    場景2:判斷查詢詞中的詞組是否全部命中文檔的title字段
    if (query_match_ratio(title) > 0.999, 1, 0)

  5. 注意事項:

  • 可以用於精排表達式

field_match_ratio: 獲取某字段上與查詢詞匹配的分詞詞組個數與該字段總詞組個數的比值

  1. 詳細用法:
    field_match_ratio(field_name)

  2. 參數:
    field_name:要統計的字段名,該字段需要為TEXT、中文基礎分詞、自定義分詞、單字分詞、英文分詞、模煳分詞類型,並且配置了索引字段

  3. 返回值:
    float,值域為[0, 1]

  4. 適用場景:
    場景1:在精排階段計算title和body與查詢詞的匹配程度
    field_match_ratio(title)*10 + field_match_ratio(body)

  5. 注意事項:

  • 可以用於精排表達式
  • 該feature可以從一定程度上反應出field與query的匹配程度。

field_length:獲取某個字段上的分詞詞組個數

  1. 詳細用法:
    field_length(field_name)

  2. 參數:
    field_name:要獲取的字段名,該字段需要為TEXT、中文基礎分詞、自定義分詞、單字分詞、英文分詞、模煳分詞類型,並且配置了索引字段。

  3. 返回值:
    int

  4. 適用場景:
    場景1:根據字段分詞詞組個數設置不同的權重
    if (field_length(title) > 200, 0.3, 0.7)

  5. 注意事項:

  • 可以用於精排表達式

query_min_slide_window:查詢詞在某個字段上命中的分詞詞組個數與該詞組在字段上最小窗口的比值

  1. 詳細用法:
    query_min_slide_window(field_name, in_order=false)

  2. 參數:
    field_name:要統計的字段,該字段需要為TEXT、中文基礎分詞、自定義分詞、單字分詞、英文分詞、模煳分詞類型,並且配置了索引字段。
    in_order:true|false,默認為false。表示進行滑動窗口比較時,窗口中詞組的順序是否必須和查詢詞中的保持一致。

  3. 返回值:
    float,值域為[0, 1]

  4. 適用場景:
    場景1:計算查詢詞在title上的最小窗口
    query_min_slide_window(title)

    場景2:判斷title字段中是否存在於查詢詞中相同的子序列
    if(query_min_slide_window(title, true) > 0.99, 1, 0)

  5. 注意事項:

  • 可以用於精排表達式;
  • 從字麵上衡量query在field_name字段上緊密度情況;
  • 影響滑動窗口計算的有兩個因素,query在field_name字段上命中的term的個數和包含這些term的最小窗口。

最後更新:2016-11-23 16:04:03

  上一篇:go 搜索相關性配置__應用高級配置_產品使用手冊_開放搜索-阿裏雲
  下一篇:go 搜索摘要配置__應用高級配置_產品使用手冊_開放搜索-阿裏雲