Rtb發展到如今,流量對廣告系統的速度要求愈來愈高。如何在用戶無感知的時間內快速從大量的廣告中選出一條呈如今用戶面前,是一個很是有研究價值的問題。本文會形象生動地介紹廣告檢索技術,瞭解系統如何從大量的廣告庫里拉出那些符合用戶流量特徵的廣告。ios
檢索其實分爲2步:1,爲廣告庫裏全部廣告創建倒排索引,2,在索引中查找符合用戶畫像的全部廣告。算法
輸入:全部廣告優化
輸出:全部廣告的倒排索引spa
輸入:全部廣告的倒排索引,用戶畫像blog
輸出:符合用戶畫像的全部廣告排序
假設如今有2個廣告,他們分別有本身的定向條件。索引
a1=年齡在(20,30)或(40,50)且性別男且在廣東=(age∈(20,30) ∪age∈(40,50))∩(gender∈{男})∩(geo∈{廣東})io
a2=年齡在(25,45)且在廣州=(age∈(25,45))∩(geo∈{廣州})請求
如今有一個用戶來請求廣告,他的用戶畫像爲:ios、男、廣州、28歲。請問哪些廣告是與他匹配的?im
接下來咱們就來看看這個過程是怎麼進行的。
正式開始以前,介紹點背景知識。
定義(析取範式)析取範式(DNF)是合取(連詞∧)子句的析取(連詞∨)。也就是說,析取範式是多個多個交集的並。
定理(範式存在定理)任何一個命題共識都存在着與之等值的析取範式與合取範式。
方案1:
第1步,創建倒排索引。
根據範式存在定理,任何一個用布爾表達式的廣告,均可以表示成析取範式的形式。那麼前面提到的a1/a2能夠變形爲:
a1=( (age∈(20,30))∩(gender∈{男})∩(geo∈{廣東}) ) ∪ ( (age∈(40,50) )∩(gender∈{男})∩(geo∈{廣東}) )
a2=(age∈(25,45))∩(geo∈{廣州})
引入j1/j2/j3,用來表明析取範式中的各個交集:
j1=(age∈(20,30))∩(gender∈{男})∩(geo∈{廣東}), j2=(age∈(40,50) )∩(gender∈{男})∩(geo∈{廣東}) , j3=(age∈(25,45))∩(geo∈{廣州})
那麼,前面提到的2則廣告能夠表示爲:
a1=j1∪j2, a2=j3
這裏進行倒排,
第2步,在索引中查找廣告。
請求廣告的用戶畫像爲:ios、男、廣州、28歲。直接去倒排索引中匹配,j1符合要求,那麼a1廣告能夠出,j2不符合要求,j3符合要求,那麼a2廣告能夠出。綜合起來看,a1/a2均符合該用戶,後續能夠再對這兩個廣告進行排序,決定最終出哪一則廣告,後續的過程就不是檢索系統的範圍了,這裏不贅述。
這個方案並非最優的,麻煩的地方在於j1~j3不多重複,這樣廣告須要匹配不少不少個j式,並非特別節省時間,下面介紹另一種優化算法,採用的兩層倒排索引。
優化方案2:
第1步,創建倒排索引。
創建兩層的倒排索引,考慮把(age∈(20,30))∩(gender∈{男})∩(geo∈{廣東})拆得更細。
引入size這個量,用來表示某個j須要同時知足多少個條件,即定向條件是多少個子條件的交集。j1,須要同時知足3個定向條件,則size=3;同理,j2,size=3;j3,須要同時知足2個定向條件,size=2。按照size組織一層索引。
對size=2中的內容,命中2次(含義是同時知足兩個條件)則算成功(兩個條件取值均爲true,那麼他們交集仍然爲true),對size=3中的內容,命中3次則算成功。以下圖所示。
第2步,在索引中查找廣告。
請求廣告的用戶畫像爲:ios、男、廣州、28歲。如今上層索引中匹配。
綜上所述,該用戶匹配到的廣告有a一、a2.