tag_match
兼容特征及功能函數(shù)項(xiàng)
兼有功能及特征函數(shù)的功能,可以同時(shí)在filter、sort及formula表達(dá)式中使用。
其中函數(shù)參數(shù)出現(xiàn)的文檔字段需根據(jù)對(duì)應(yīng)函數(shù)文檔提示,創(chuàng)建為索引或?qū)傩?/b>.
tag_match : 用于對(duì)查詢語(yǔ)句和文檔做標(biāo)簽匹配,使用匹配結(jié)果對(duì)文檔進(jìn)行算分加權(quán)
1.場(chǎng)景概述:
涉及query和文檔匹配的很多需求都可以使用或者轉(zhuǎn)化為tag_match來滿足,對(duì)實(shí)現(xiàn)搜索個(gè)性化需求尤其有用。例如優(yōu)先出現(xiàn)用戶點(diǎn)贊過的店鋪,優(yōu)先展現(xiàn)用戶喜歡的體育和娛樂類新聞等。tag_match最基本的功能是在文檔的某個(gè)ARRAY字段中存儲(chǔ)一系列的key-value信息。然后在查詢query中通過kvpairs子句傳遞對(duì)應(yīng)的key-value信息,tag_match就會(huì)去文檔中尋找查詢query中的key, 然后為每個(gè)匹配的key計(jì)算得到一個(gè)分?jǐn)?shù),再合并所有匹配的key的分?jǐn)?shù)得到一個(gè)最終分。這個(gè)結(jié)果就可以用來做算分加權(quán)或者過濾。
計(jì)算過程如下:
2.詳細(xì)用法:
常見用法:
tag_match(query_key, doc_field, kv_op, merge_op)
高級(jí)用法:
tag_match(query_key, doc_field, kv_op, merge_op, has_default, doc_kv, max_kv_count)
3.參數(shù):
query_key:指定查詢語(yǔ)句中用于匹配的字段key-value值,該字段需要通過kvpairs子句傳遞,key與value通過英文等號(hào)‘=’分隔,多個(gè)key-value通過英文冒號(hào)‘:’分隔,如: kvpairs=query_tags:10=0.67:960=0.85:1=48//表示參數(shù)query_tags中包含3個(gè)元素:10、960、1,其對(duì)應(yīng)的value分別是:0.67、0.85、48。其中query也可以只為key的列表,如:kvpairs=cats:10:960:1。
doc_field:指定文檔中存儲(chǔ)key-value的字段名,該字段只支持整型【int_array】或者浮點(diǎn)型【float_array,double_array】數(shù)組字段類型(如果是浮點(diǎn)型數(shù)組字段類型,則key的值匹配的時(shí)強(qiáng)轉(zhuǎn)當(dāng)int64來處理)。數(shù)組的奇數(shù)位置是key,下一個(gè)相鄰的偶數(shù)位置為key的value。即 [key0 value0 key1 value1 …]
kv_op:當(dāng)query_key中的值與doc_field中的key匹配時(shí)對(duì)二者的value所采取的操作,目前支持的操作符如下:max(最大值)、min(最小值)、sum(求和)、avg(平均數(shù))、mul(乘積)、query_value(query_key中該key對(duì)應(yīng)的value值)、doc_value(文檔中該key對(duì)應(yīng)的value值)、number(常數(shù))。
merge_op:多個(gè)key匹配后會(huì)產(chǎn)生多個(gè)結(jié)果,merge_op指定了將這些結(jié)果進(jìn)行如何操作,目前支持的操作類型如下:max(最大值)、min(最小值)、sum(求和)、avg(平均值)、first_match(取第一個(gè)kv_op的計(jì)算結(jié)果,忽略其他結(jié)果)。
has_default:默認(rèn)是false,表示不啟動(dòng)初始分值;為true時(shí)說明doc_field的第一個(gè)值為默認(rèn)值,[init_score k0 v0 k1 v1…]。(類似base分值的概念)
doc_kv:默認(rèn)是true。表明doc_field字段中的值是以key-value對(duì)的形式存在;為false則表示doc_field中只包含key信息。
max_kv_count:因?yàn)椴樵冎械膋ey-value結(jié)構(gòu)需要通過query傳遞,所有tag_match對(duì)query中能傳遞多少key-value有限制。默認(rèn)為50,可以通過這個(gè)參數(shù)將這個(gè)限制調(diào)大,但是最大不能超過5120。
4.返回值:
double,返回具體的分值,如果has_default為false并且沒有配額的內(nèi)容則為0.如果需要返回int64的結(jié)果,需要使用int_tag_match,該函數(shù)功能與參數(shù)與int_tag_match完全一致,但int_tag_match不能在排序表達(dá)式中使用。
5.適用場(chǎng)景
場(chǎng)景1:一個(gè)大型的綜合性論壇,帖子可以被打上各種各樣的標(biāo)簽(搞笑,體育,新聞,音樂,科普..)。我們?cè)谕扑徒oOpenSearch的文檔中,可以為每個(gè)標(biāo)簽賦予一個(gè)標(biāo)簽id(例如搞笑-1, 體育-5, 新聞-3, 音樂-6..), 然后通過一個(gè)tag字段存儲(chǔ)這些標(biāo)簽。 如果我們對(duì)帖子做過預(yù)處理,甚至能得到每個(gè)帖子每個(gè)標(biāo)簽的權(quán)重,例如一個(gè)搞笑體育新聞的帖子可以得到搞笑的權(quán)重為0.5,體育的權(quán)重為0.5,新聞權(quán)重為0.1,則這個(gè)帖子的tag字段的值為[1 0.5 5 0.5 3 0.1]對(duì)會(huì)員用戶,通過長(zhǎng)時(shí)間的積累,我們能獲知每個(gè)用戶的興趣標(biāo)簽。
例如用戶nba_fans對(duì)體育和搞笑很感興趣,他對(duì)應(yīng)的體育和搞笑標(biāo)簽的權(quán)重分別為0.6和0.3。那么這個(gè)用戶查詢時(shí),我們就可以通過kv_pairs子句把這個(gè)信息加到query里面。假如這個(gè)kv_pairs子句名字為user_tag, 那么nba_fans的user_tag的值5=0.6:1=0.3。這樣,我們只要在精排表達(dá)式中配置了tag_match(user_tag, tag, mul, sum), 我們就能夠?qū)崿F(xiàn)對(duì)用戶感興趣的帖子加權(quán),把用戶更感興趣的帖子排到前面。
例如nba_fans搜索到上面那個(gè)帖子時(shí),搞笑和體育這兩個(gè)標(biāo)簽?zāi)軌蚱ヅ涞健Mㄟ^指定kv_op參數(shù)為mul,我們會(huì)把query和doc中的值相乘,他們各自的計(jì)算分?jǐn)?shù)分別為(體育:0.5 * 0.6 = 0.3, 搞笑:0.5 * 0.3 = 0.15)。通過指定merge_op參數(shù)為sum,我們會(huì)把體育和搞笑的分?jǐn)?shù)加和(0.3+0.15 = 0.45),這個(gè)加和的分?jǐn)?shù)會(huì)加到最終的排序分?jǐn)?shù)上。這樣,我們就能夠?qū)崿F(xiàn)了對(duì)這個(gè)用戶感興趣帖子的排序加權(quán)。
場(chǎng)景2:
商品可以具有多個(gè)屬性標(biāo)簽,如1表示年輕人(年齡)、2表示中年人(年齡)、3表示小清新(風(fēng)格)、4表示時(shí)尚(風(fēng)格)、5表示女性(性別)、6表示男性(性別)等。
假設(shè)我們只想表示商品有沒有某個(gè)標(biāo)簽,不想?yún)^(qū)分哪個(gè)標(biāo)簽更重要。這個(gè)標(biāo)簽通過options字段來保存。那么年輕時(shí)尚女性的衣服的options字段可以表示為[1 4 5], 注意這里只有標(biāo)簽key,沒有value。用戶也都有自己的屬性標(biāo)簽,和商品標(biāo)簽對(duì)應(yīng)。例如年輕女性用戶,歷史成交中多購(gòu)買小清新風(fēng)格衣服。這該用戶的查詢可以寫為user_options=1:3:5。注意這里kv_pair中也是只有標(biāo)簽key,沒有value的。
要實(shí)現(xiàn)對(duì)符合用戶標(biāo)簽喜好的商品加權(quán),我們可以在formula中使用tag_match(user_options, options, 10, sum, false, false)。這里我們通過user_options和options指定了query和doc的標(biāo)簽信息。kv_op設(shè)為常數(shù)10,表示只要有標(biāo)簽匹配到,那么匹配的計(jì)算結(jié)果就是10。has_default為false,表示我們不需要初始值。doc_kv為false,表示我們doc中只存儲(chǔ)了key信息,沒有value。
這樣,上面的年輕女用戶查詢到上面的衣服時(shí),女性和年輕兩個(gè)標(biāo)簽?zāi)軌蚱ヅ渖希@兩個(gè)標(biāo)簽的計(jì)算結(jié)果都是10。通過sum這個(gè)merge_op,能夠得到這件商品的最終加權(quán)分?jǐn)?shù)為20。通過這種方式,即使我們沒有標(biāo)簽的權(quán)重信息,也能夠?qū)崿F(xiàn)對(duì)匹配到的文檔做排序加權(quán)。
注意事項(xiàng)
函數(shù)參數(shù)依賴字段需創(chuàng)建為屬性
如果是用在filter或者sort子句中,則query_key、kv_op、merge_op、has_default、doc_kv必須使用雙引號(hào)括起來,如:sort=-tag_match(“user_options”, options, “mul”, “sum”, “false”, “true”, 100)。
tag_match的key匹配都是通過整數(shù)比較來完成的。因此query和doc中的key都應(yīng)該轉(zhuǎn)換為整數(shù)形式,如果是浮點(diǎn)類型,tag_match在比較時(shí),會(huì)強(qiáng)制轉(zhuǎn)換為整數(shù)類型。
案例演示
假設(shè)文檔內(nèi)容共有如下10類型的標(biāo)簽:
1-財(cái)經(jīng)
2-科技
3-體育
4-娛樂
5-時(shí)尚
6-教育
7-旅游
8-游戲
9-科普
10-醫(yī)療
案例1:關(guān)鍵詞相同,但是標(biāo)簽不同的title:
如上圖所示,搜索“吃雞”出現(xiàn)兩篇doc,但是二者的類型不同,分別是1-財(cái)經(jīng)、8-游戲,如果想將“游戲”標(biāo)簽的文檔在前面展示,可設(shè)置tag_match函數(shù),以下分別演示配置在排序表達(dá)式和sort子句中的方法:
kvpairs:type:8
排序表達(dá)式:tag_match(type, type_arr, 10, max,false,false)
sort子句:tag_match("type", type_arr, 10, "max","false","false")
排序表達(dá)式展示的結(jié)果:sort子句展示的結(jié)果:
案例2:多標(biāo)簽綜合得分展示(可針對(duì)用戶的個(gè)性化推薦)
如圖,在一級(jí)標(biāo)簽相同的情況下,需要匹配二級(jí)標(biāo)簽的得分,以下分別演示配置在排序表達(dá)式和sort子句中的方法:
kvpairs:type:3=2:10=1
排序表達(dá)式:tag_match(type, type_arr, 10, sum,false,true)
sort子句:tag_match("type", type_arr, 10, "sum","false","true")
案例3:多標(biāo)簽同類型,不同得分
如圖,紅框展示的內(nèi)容,都同屬于同樣的標(biāo)簽,但是每個(gè)標(biāo)簽的打分不同,以下分別演示配置在排序表達(dá)式和sort子句中的方法:
kvpairs:type:3=2:9=2
排序表達(dá)式:tag_match(type, type_arr, sum, sum,false,true)
sort子句:tag_match("type", type_arr, "sum", "sum","false","true")
Java sdk 示例參考:Java sdk 搜索Demo