搜索引擎與程序化廣告:原理、設(shè)計與實戰(zhàn)
定 價:109.8 元
- 作者:楊敏
- 出版時間:2023/9/1
- ISBN:9787115617002
- 出 版 社:人民郵電出版社
- 中圖法分類:F713.80
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:128開
本書從源碼的角度講解搜索技術(shù)與程序化廣告系統(tǒng),將技術(shù)與業(yè)務(wù)結(jié)合、理論與實踐并重,幫助讀者更好地理解并掌握相關(guān)知識。
本書首先從基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)出發(fā),帶領(lǐng)讀者深入理解線性結(jié)構(gòu)、樹結(jié)構(gòu)和圖結(jié)構(gòu)的搜索算法,以及它們的典型應(yīng)用場景。其次詳細(xì)分析全文搜索引擎工具包Lucene,包括其索引結(jié)構(gòu)、分析器、搜索與排名機制,以及Lucene的底層數(shù)據(jù)結(jié)構(gòu)與算法。最后,本書從搜索技術(shù)過渡到程序化廣告,介紹程序化廣告系統(tǒng)中的各個模塊和工作機制,包含廣告檢索、廣告庫存預(yù)測、廣告定位、廣告標(biāo)簽?zāi)0濉V告實時競價、廣告實時數(shù)據(jù)、廣告事件流聚合、廣告供應(yīng)鏈透明度等內(nèi)容。
本書適合從事搜索技術(shù)、程序化廣告相關(guān)工作或?qū)ο嚓P(guān)內(nèi)容感興趣的軟件開發(fā)人員閱讀。在閱讀本書之前,讀者需要具備基本的編程能力。
(1)理論與實踐并重——本書是市面上少有的從源碼角度講解搜索引擎與程序化廣告技術(shù)的圖書。
(2)技術(shù)與業(yè)務(wù)相結(jié)合——系統(tǒng)性地介紹程序化廣告相關(guān)的各項業(yè)務(wù)及其用到的技術(shù)知識。
(3)知識深入淺出——從基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)出發(fā),循序漸進(jìn)講解搜索算法及其應(yīng)用。
(4)內(nèi)容系統(tǒng)全面——涵蓋Lucene索引創(chuàng)建、查詢解析、搜索排名,以及底層數(shù)據(jù)結(jié)構(gòu)與算法。
(5)作者經(jīng)驗豐富——本書作者在專門提供互聯(lián)網(wǎng)視頻廣告投放、預(yù)測、增值等解決方案的公司Freewheel擔(dān)任廣告供應(yīng)方平臺(Supply Side Platform,SSP)的技術(shù)負(fù)責(zé)人、軟件架構(gòu)師。
(6)業(yè)內(nèi)大咖推薦——微軟Bing首席工程師、阿里P9技術(shù)總監(jiān)、FreeWheel技術(shù)副總裁等多位技術(shù)專家鼎力推薦。
楊敏,畢業(yè)于浙江大學(xué)計算機科學(xué)與技術(shù)專業(yè),目前就職于一家專門提供互聯(lián)網(wǎng)視頻廣告投放、預(yù)測和增值等解決方案的公司——Freewheel,擔(dān)任廣告供應(yīng)方平臺(Supply Side Platform,SSP)的技術(shù)負(fù)責(zé)人、軟件架構(gòu)師。他曾在美國道富銀行、微軟、Thoughtworks等公司工作,擁有豐富的程序化廣告產(chǎn)品開發(fā)與設(shè)計經(jīng)驗。他曾參與或主持開發(fā)過的項目有:
·美國道富銀行的普林斯頓金融系統(tǒng);
·普華永道全球派遣服務(wù)軟件系統(tǒng);
·微軟SharePoint平臺的搜索系統(tǒng);
·Freewheel的廣告供應(yīng)方平臺Stickyads.tv。
他目前專注于Python/Java虛擬機、分布式搜索引擎Elasticsearch、MySQL內(nèi)核等相關(guān)技術(shù)領(lǐng)域的研究。
第 1 章 搜索技術(shù)的算法 1
1.1 背景 1
1.2 字符串搜索 2
1.2.1 概述 2
1.2.2 基礎(chǔ)字符串搜索算法:暴力搜索算法 2
1.2.3 中級字符串搜索算法:KMP 算法 4
1.2.4 高級字符串搜索算法:BM 算法 9
1.2.5 字符串精確搜索:Grep 12
1.2.6 字符串模糊搜索 12
1.3 樹搜索 19
1.3.1 概述 19
1.3.2 二叉搜索樹 21
1.3.3 2-3-4 樹 22
1.3.4 2-3-4 樹與紅黑樹的等價關(guān)系 28
1.3.5 紅黑樹操作 34
1.3.6 紅黑樹典型應(yīng)用場景 50
1.4 圖搜索 50
1.4.1 概述 50
1.4.2 圖建模中,鄰接矩陣和鄰接表哪種結(jié)構(gòu)更好? 51
1.4.3 DFS 在圖搜索和樹搜索中的應(yīng)用 53
1.4.4 DFS 無向圖連通分量問題 55
1.4.5 DFS 單源路徑問題 58
1.4.6 BFS 單源(最短)路徑問題 61
1.4.7 DFS 檢測無向圖中的環(huán) 64
1.4.8 二分圖檢測與染色算法 66
1.4.9 拓?fù)渑判? 68
1.4.10 動態(tài)規(guī)劃和遞歸之間的關(guān)系 72
1.5 小結(jié) 73
第 2 章 Lucene 基礎(chǔ) 75
2.1 背景 75
2.2 Lucene 與傳統(tǒng)關(guān)系數(shù)據(jù)庫 76
2.2.1 Lucene 與傳統(tǒng)關(guān)系數(shù)據(jù)庫的異同 76
2.2.2 Lucene 的全文搜索機制 77
2.2.3 倒排索引的使用場景 78
2.3 Lucene 與 Elasticsearch 79
2.4 Lucene 的倒排索引設(shè)計 80
2.4.1 倒排索引 80
2.4.2 Posting 數(shù)據(jù)結(jié)構(gòu) 80
2.4.3 ByteBlockPool 動態(tài)數(shù)組 81
2.4.4 Posting 與 ByteBlockPool 的關(guān)系 83
2.4.5 ThreadState 結(jié)構(gòu) 84
2.4.6 DocumentsWriter 結(jié)構(gòu) 85
2.5 Lucene 的正排索引設(shè)計 92
2.5.1 正排索引與倒排索引 92
2.5.2 Lucene 的正排索引與數(shù)學(xué)中的向量的關(guān)系 93
2.5.3 正排索引存儲 94
2.5.4 索引數(shù)據(jù)的寫流程 96
2.6 有效負(fù)載 97
2.6.1 有效負(fù)載的結(jié)構(gòu) 97
2.6.2 有效負(fù)載的格式 98
2.6.3 文檔權(quán)重與域權(quán)重 99
2.6.4 權(quán)重與有效負(fù)載 99
2.6.5 有效負(fù)載的應(yīng)用場景 100
2.7 復(fù)合索引文件 103
2.7.1 復(fù)合索引的文件格式 104
2.7.2 寫復(fù)合索引文件 105
2.8 小結(jié) 106
第 3 章 Lucene 索引段 108
3.1 背景 108
3.2 不同索引結(jié)構(gòu)的比較 108
3.2.1 MySQL:B+樹 109
3.2.2 MySQL:哈希索引 109
3.2.3 Redis:跳表 109
3.2.4 Lucene:倒排索引 111
3.3 索引段的基礎(chǔ)知識 112
3.3.1 概述 112
3.3.2 SegmentInfos 容器 113
3.3.3 IndexReader 116
3.3.4 SegmentReader 118
3.3.5 倒排索引格式 119
3.3.6 索引段的讀流程 124
3.4 索引段的合并 126
3.4.1 概述 126
3.4.2 段合并的典型問題 127
3.4.3 段合并的策略 129
3.4.4 段合并的簡單流程 132
3.4.5 合并段內(nèi)域:mergeFields 135
3.4.6 合并段內(nèi)分詞:mergeTerms 143
3.4.7 合并段內(nèi)詞向量:mergeVectors 154
3.5 索引段提交點與快照 155
3.5.1 概述 155
3.5.2 提交點 155
3.5.3 快照 158
3.5.4 觸發(fā)快照的場景 159
3.6 索引段刪除文檔 160
3.6.1 概述 160
3.6.2 del 擴展文件 160
3.6.3 位向量 162
3.6.4 索引段刪除分詞 164
3.6.5 索引段查詢分詞 165
3.7 小結(jié) 166
第 4 章 Lucene 分析器 167
4.1 背景 167
4.2 Field、Token 與 Term 概念 168
4.3 JavaCC 與查詢解析器 170
4.3.1 Yacc 與 JavaCC 170
4.3.2 在 JavaCC 中擴展正則表達(dá)式 171
4.3.3 JavaCC 的輸入文件之XX.jj 172
4.3.4 Lucene 中 Token 的正則表達(dá)式定義 173
4.3.5 Lucene 語法產(chǎn)生式:分析與生成查詢 175
4.3.6 getFieldQuery 公共函數(shù) 181
4.4 分析器 184
4.4.1 概述 184
4.4.2 分析器的組成:分詞器和過濾器 185
4.4.3 分析器的兩個典型場景 187
4.4.4 索引的構(gòu)建流程 188
4.4.5 QueryParse 查詢流程 188
4.4.6 位置增量 190
4.5 中文分詞器 195
4.5.1 概述 195
4.5.2 中文分詞器的思想 196
4.5.3 sego 中文分詞器 198
4.5.4 雙數(shù)組前綴樹算法 204
4.5.5 維特比算法 210
4.5.6 迪杰斯特拉算法 210
4.6 小結(jié) 213
第 5 章 Lucene 搜索與排名 214
5.1 背景 214
5.2 搜索結(jié)果排名 215
5.2.1 TF-IDF 模型 215
5.2.2 余弦相似性 219
5.3 過濾器 220
5.3.1 概述 220
5.3.2 過濾 220
5.3.3 CachingWrapperFilter 225
5.3.4 創(chuàng)建自定義過濾器 226
5.3.5 過濾與查詢的區(qū)別 227
5.4 全文搜索 227
5.4.1 概述 227
5.4.2 Query、Weight 和 Scorer 對象樹 228
5.4.3 搜索流程(關(guān)閉過濾器) 230
5.5 短語搜索:相關(guān)性搜索 246
5.5.1 概述 246
5.5.2 一個查詢短語舉例 246
5.5.3 TermPositions 與 TermDocs 250
5.5.4 PhraseQuery 類體系 250
5.5.5 PhraseScorer 工作流 251
5.5.6 MultiPhraseQuery 259
5.6 模糊搜索:利用模糊性改善搜索性能 259
5.6.1 概述 259
5.6.2 編輯距離算法 259
5.6.3 FuzzyQuery 工作流 261
5.7 小結(jié) 265
第 6 章 Lucene 的底層數(shù)據(jù)結(jié)構(gòu)與算法 266
6.1 背景 266
6.2 編碼與壓縮算法 268
6.2.1 概述 268
6.2.2 前綴編碼 268
6.2.3 增量編碼 269
6.2.4 變長字節(jié)編碼 270
6.3 跳表結(jié)構(gòu):分層有序鏈表 271
6.3.1 概述 271
6.3.2 跳表的定義與規(guī)則 272
6.3.3 從單鏈表到跳表 273
6.3.4 跳表的特點 274
6.3.5 frq 索引文件中的跳表設(shè)計 275
6.3.6 索引的設(shè)計思想:空間換時間 276
6.3.7 MultiLevelSkipListWriter 類的相關(guān)狀態(tài) 277
6.3.8 MultiLevelSkipListWriter 類的相關(guān)操作 279
6.3.9 MultiLevelSkipListReader 類的相關(guān)狀態(tài)和操作 285
6.4 ByteSliceReader 結(jié)構(gòu) 288
6.4.1 概述 288
6.4.2 ByteBlockPool 數(shù)據(jù)結(jié)構(gòu) 289
6.4.3 ByteBlockPool 使用數(shù)組來模擬鏈表 293
6.4.4 Posting 倒排列表與 ByteBlockPool 的關(guān)系 294
6.4.5 ByteSliceReader 數(shù)據(jù)結(jié)構(gòu) 295
6.5 ByteBlockPool 結(jié)構(gòu):數(shù)組模擬鏈表 296
6.5.1 概述 296
6.5.2 數(shù)組如何模擬鏈表 296
6.5.3 鏈表與數(shù)組 298
6.5.4 線性與非線性結(jié)構(gòu) 298
6.5.5 ByteBlockPool 再思考 299
6.6 小結(jié) 300
第 7 章 廣告檢索與定位 302
7.1 背景 302
7.2 全文索引和檢索 302
7.2.1 概述 302
7.2.2 全文索引模型 303
7.2.3 檢索模型 303
7.2.4 關(guān)系數(shù)據(jù)庫中索引的設(shè)計 305
7.2.5 一個簡單倒排索引的設(shè)計 306
7.3 位圖索引 307
7.3.1 概述 307
7.3.2 位圖索引結(jié)構(gòu) 307
7.3.3 位圖索引中的編碼 309
7.3.4 位圖索引的構(gòu)建與查詢 310
7.3.5 對倒排文本進(jìn)行位圖索引 313
7.4 用 Be_indexer 開源框架實現(xiàn)廣告索引 313
7.4.1 文檔類體系 313
7.4.2 FieldDesc 類體系 315
7.4.3 字典編碼 315
7.4.4 Be_indexer 框架的基本流程 318
7.4.5 Be_indexer框架的倒排索引 325
7.5 程序化廣告概述 326
7.5.1 程序化廣告是什么? 326
7.5.2 程序化廣告系統(tǒng)的主要模塊 327
7.6 廣告檢索 328
7.6.1 概述 328
7.6.2 廣告選擇:用布爾邏輯表達(dá)式實現(xiàn) 328
7.6.3 廣告選擇:用 DNF 實現(xiàn) 329
7.6.4 用 Clorisearch 開源框架實現(xiàn)廣告檢索 332
7.7 廣告庫存預(yù)測 342
7.7.1 概述 342
7.7.2 定向廣告和重定向廣告 342
7.7.3 命題邏輯基礎(chǔ) 343
7.7.4 DNF 的應(yīng)用 347
7.7.5 廣告庫存預(yù)測:用 DNF 算法實現(xiàn) 350
7.8 廣告定位:用戶身份圖構(gòu)建與搜索 351
7.8.1 概述 351
7.8.2 Cookie 352
7.8.3 同一用戶在不同平臺中的身份匹配:用戶匹配表 354
7.8.4 演進(jìn) 1:集中式 Cookie 同步技術(shù) 355
7.8.5 演進(jìn) 2:用戶身份圖 357
7.9 廣告定位:通過 DMP 幫助用戶匹配正確的廣告 361
7.9.1 概述 361
7.9.2 DMP 的基礎(chǔ)知識 361
7.9.3 DMP 分段 362
7.9.4 DMP 和 DSP 的協(xié)同工作 364
7.9.5 DMP 的用戶數(shù)據(jù)在 DSP 中的使用場景 364
7.10 小結(jié) 367
第 8 章 程序化廣告技術(shù) 369
8.1 背景 369
8.2 廣告標(biāo)簽?zāi)0? 370
8.2.1 VAST 工作流程 371
8.2.2 VAST 格式 371
8.3 廣告實時競價 373
8.3.1 RTB 工作流程 373
8.3.2 投標(biāo)請求 374
8.3.3 投標(biāo)響應(yīng) 378
8.4 廣告實時數(shù)據(jù) 380
8.4.1 廣告日志數(shù)據(jù) 380
8.4.2 廣告生命周期:事件流 381
8.4.3 廣告數(shù)據(jù)聚合 382
8.5 廣告事件流聚合 384
8.5.1 概述 384
8.5.2 需求 384
8.5.3 解決思路:數(shù)據(jù)管道架構(gòu) 385
8.5.4 方案 1 - 數(shù)據(jù)管道:Kafka 385
8.5.5 方案 2 - 數(shù)據(jù)管道:Kafka + Cassandra 386
8.5.6 方案 3 - 數(shù)據(jù)管道:Kafka + Spark + Cassandra 387
8.5.7 方案 4 - 數(shù)據(jù)管道:Kafka + Spark + Cassandra + Data-Version 390
8.6 廣告供應(yīng)鏈透明度分析 392
8.6.1 Ads.txt 392
8.6.2 Seller.json 394
8.6.3 供應(yīng)鏈對象 394
8.6.4 Ads.txt、Seller.json 和供應(yīng)鏈對象的關(guān)系 395
8.7 小結(jié) 396