搜索引擎與程序化廣告:原理、設計與實戰(zhàn)
定 價:109.8 元
- 作者:楊敏
- 出版時間:2023/9/1
- ISBN:9787115617002
- 出 版 社:人民郵電出版社
- 中圖法分類:F713.80
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:128開
本書從源碼的角度講解搜索技術與程序化廣告系統(tǒng),將技術與業(yè)務結合、理論與實踐并重,幫助讀者更好地理解并掌握相關知識。
本書首先從基礎的數據結構出發(fā),帶領讀者深入理解線性結構、樹結構和圖結構的搜索算法,以及它們的典型應用場景。其次詳細分析全文搜索引擎工具包Lucene,包括其索引結構、分析器、搜索與排名機制,以及Lucene的底層數據結構與算法。最后,本書從搜索技術過渡到程序化廣告,介紹程序化廣告系統(tǒng)中的各個模塊和工作機制,包含廣告檢索、廣告庫存預測、廣告定位、廣告標簽模板、廣告實時競價、廣告實時數據、廣告事件流聚合、廣告供應鏈透明度等內容。
本書適合從事搜索技術、程序化廣告相關工作或對相關內容感興趣的軟件開發(fā)人員閱讀。在閱讀本書之前,讀者需要具備基本的編程能力。
(1)理論與實踐并重——本書是市面上少有的從源碼角度講解搜索引擎與程序化廣告技術的圖書。
(2)技術與業(yè)務相結合——系統(tǒng)性地介紹程序化廣告相關的各項業(yè)務及其用到的技術知識。
(3)知識深入淺出——從基礎的數據結構出發(fā),循序漸進講解搜索算法及其應用。
(4)內容系統(tǒng)全面——涵蓋Lucene索引創(chuàng)建、查詢解析、搜索排名,以及底層數據結構與算法。
(5)作者經驗豐富——本書作者在專門提供互聯網視頻廣告投放、預測、增值等解決方案的公司Freewheel擔任廣告供應方平臺(Supply Side Platform,SSP)的技術負責人、軟件架構師。
(6)業(yè)內大咖推薦——微軟Bing首席工程師、阿里P9技術總監(jiān)、FreeWheel技術副總裁等多位技術專家鼎力推薦。
楊敏,畢業(yè)于浙江大學計算機科學與技術專業(yè),目前就職于一家專門提供互聯網視頻廣告投放、預測和增值等解決方案的公司——Freewheel,擔任廣告供應方平臺(Supply Side Platform,SSP)的技術負責人、軟件架構師。他曾在美國道富銀行、微軟、Thoughtworks等公司工作,擁有豐富的程序化廣告產品開發(fā)與設計經驗。他曾參與或主持開發(fā)過的項目有:
·美國道富銀行的普林斯頓金融系統(tǒng);
·普華永道全球派遣服務軟件系統(tǒng);
·微軟SharePoint平臺的搜索系統(tǒng);
·Freewheel的廣告供應方平臺Stickyads.tv。
他目前專注于Python/Java虛擬機、分布式搜索引擎Elasticsearch、MySQL內核等相關技術領域的研究。
第 1 章 搜索技術的算法 1
1.1 背景 1
1.2 字符串搜索 2
1.2.1 概述 2
1.2.2 基礎字符串搜索算法:暴力搜索算法 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 樹與紅黑樹的等價關系 28
1.3.5 紅黑樹操作 34
1.3.6 紅黑樹典型應用場景 50
1.4 圖搜索 50
1.4.1 概述 50
1.4.2 圖建模中,鄰接矩陣和鄰接表哪種結構更好? 51
1.4.3 DFS 在圖搜索和樹搜索中的應用 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 拓撲排序 68
1.4.10 動態(tài)規(guī)劃和遞歸之間的關系 72
1.5 小結 73
第 2 章 Lucene 基礎 75
2.1 背景 75
2.2 Lucene 與傳統(tǒng)關系數據庫 76
2.2.1 Lucene 與傳統(tǒng)關系數據庫的異同 76
2.2.2 Lucene 的全文搜索機制 77
2.2.3 倒排索引的使用場景 78
2.3 Lucene 與 Elasticsearch 79
2.4 Lucene 的倒排索引設計 80
2.4.1 倒排索引 80
2.4.2 Posting 數據結構 80
2.4.3 ByteBlockPool 動態(tài)數組 81
2.4.4 Posting 與 ByteBlockPool 的關系 83
2.4.5 ThreadState 結構 84
2.4.6 DocumentsWriter 結構 85
2.5 Lucene 的正排索引設計 92
2.5.1 正排索引與倒排索引 92
2.5.2 Lucene 的正排索引與數學中的向量的關系 93
2.5.3 正排索引存儲 94
2.5.4 索引數據的寫流程 96
2.6 有效負載 97
2.6.1 有效負載的結構 97
2.6.2 有效負載的格式 98
2.6.3 文檔權重與域權重 99
2.6.4 權重與有效負載 99
2.6.5 有效負載的應用場景 100
2.7 復合索引文件 103
2.7.1 復合索引的文件格式 104
2.7.2 寫復合索引文件 105
2.8 小結 106
第 3 章 Lucene 索引段 108
3.1 背景 108
3.2 不同索引結構的比較 108
3.2.1 MySQL:B+樹 109
3.2.2 MySQL:哈希索引 109
3.2.3 Redis:跳表 109
3.2.4 Lucene:倒排索引 111
3.3 索引段的基礎知識 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 合并段內域:mergeFields 135
3.4.6 合并段內分詞:mergeTerms 143
3.4.7 合并段內詞向量: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 小結 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 中擴展正則表達式 171
4.3.3 JavaCC 的輸入文件之XX.jj 172
4.3.4 Lucene 中 Token 的正則表達式定義 173
4.3.5 Lucene 語法產生式:分析與生成查詢 175
4.3.6 getFieldQuery 公共函數 181
4.4 分析器 184
4.4.1 概述 184
4.4.2 分析器的組成:分詞器和過濾器 185
4.4.3 分析器的兩個典型場景 187
4.4.4 索引的構建流程 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 雙數組前綴樹算法 204
4.5.5 維特比算法 210
4.5.6 迪杰斯特拉算法 210
4.6 小結 213
第 5 章 Lucene 搜索與排名 214
5.1 背景 214
5.2 搜索結果排名 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 搜索流程(關閉過濾器) 230
5.5 短語搜索:相關性搜索 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 小結 265
第 6 章 Lucene 的底層數據結構與算法 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 跳表結構:分層有序鏈表 271
6.3.1 概述 271
6.3.2 跳表的定義與規(guī)則 272
6.3.3 從單鏈表到跳表 273
6.3.4 跳表的特點 274
6.3.5 frq 索引文件中的跳表設計 275
6.3.6 索引的設計思想:空間換時間 276
6.3.7 MultiLevelSkipListWriter 類的相關狀態(tài) 277
6.3.8 MultiLevelSkipListWriter 類的相關操作 279
6.3.9 MultiLevelSkipListReader 類的相關狀態(tài)和操作 285
6.4 ByteSliceReader 結構 288
6.4.1 概述 288
6.4.2 ByteBlockPool 數據結構 289
6.4.3 ByteBlockPool 使用數組來模擬鏈表 293
6.4.4 Posting 倒排列表與 ByteBlockPool 的關系 294
6.4.5 ByteSliceReader 數據結構 295
6.5 ByteBlockPool 結構:數組模擬鏈表 296
6.5.1 概述 296
6.5.2 數組如何模擬鏈表 296
6.5.3 鏈表與數組 298
6.5.4 線性與非線性結構 298
6.5.5 ByteBlockPool 再思考 299
6.6 小結 300
第 7 章 廣告檢索與定位 302
7.1 背景 302
7.2 全文索引和檢索 302
7.2.1 概述 302
7.2.2 全文索引模型 303
7.2.3 檢索模型 303
7.2.4 關系數據庫中索引的設計 305
7.2.5 一個簡單倒排索引的設計 306
7.3 位圖索引 307
7.3.1 概述 307
7.3.2 位圖索引結構 307
7.3.3 位圖索引中的編碼 309
7.3.4 位圖索引的構建與查詢 310
7.3.5 對倒排文本進行位圖索引 313
7.4 用 Be_indexer 開源框架實現廣告索引 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 廣告選擇:用布爾邏輯表達式實現 328
7.6.3 廣告選擇:用 DNF 實現 329
7.6.4 用 Clorisearch 開源框架實現廣告檢索 332
7.7 廣告庫存預測 342
7.7.1 概述 342
7.7.2 定向廣告和重定向廣告 342
7.7.3 命題邏輯基礎 343
7.7.4 DNF 的應用 347
7.7.5 廣告庫存預測:用 DNF 算法實現 350
7.8 廣告定位:用戶身份圖構建與搜索 351
7.8.1 概述 351
7.8.2 Cookie 352
7.8.3 同一用戶在不同平臺中的身份匹配:用戶匹配表 354
7.8.4 演進 1:集中式 Cookie 同步技術 355
7.8.5 演進 2:用戶身份圖 357
7.9 廣告定位:通過 DMP 幫助用戶匹配正確的廣告 361
7.9.1 概述 361
7.9.2 DMP 的基礎知識 361
7.9.3 DMP 分段 362
7.9.4 DMP 和 DSP 的協同工作 364
7.9.5 DMP 的用戶數據在 DSP 中的使用場景 364
7.10 小結 367
第 8 章 程序化廣告技術 369
8.1 背景 369
8.2 廣告標簽模板 370
8.2.1 VAST 工作流程 371
8.2.2 VAST 格式 371
8.3 廣告實時競價 373
8.3.1 RTB 工作流程 373
8.3.2 投標請求 374
8.3.3 投標響應 378
8.4 廣告實時數據 380
8.4.1 廣告日志數據 380
8.4.2 廣告生命周期:事件流 381
8.4.3 廣告數據聚合 382
8.5 廣告事件流聚合 384
8.5.1 概述 384
8.5.2 需求 384
8.5.3 解決思路:數據管道架構 385
8.5.4 方案 1 - 數據管道:Kafka 385
8.5.5 方案 2 - 數據管道:Kafka + Cassandra 386
8.5.6 方案 3 - 數據管道:Kafka + Spark + Cassandra 387
8.5.7 方案 4 - 數據管道:Kafka + Spark + Cassandra + Data-Version 390
8.6 廣告供應鏈透明度分析 392
8.6.1 Ads.txt 392
8.6.2 Seller.json 394
8.6.3 供應鏈對象 394
8.6.4 Ads.txt、Seller.json 和供應鏈對象的關系 395
8.7 小結 396