搜索引擎與程序化廣告:原理、設計與實戰

楊敏

  • 搜索引擎與程序化廣告:原理、設計與實戰-preview-1
  • 搜索引擎與程序化廣告:原理、設計與實戰-preview-2
搜索引擎與程序化廣告:原理、設計與實戰-preview-1

買這商品的人也買了...

商品描述

本書從源碼的角度講解搜索技術與程序化廣告系統,將技術與業務結合、理論與實踐並重,幫助讀者更好地理解並掌握相關知識。

本書首先從基礎的數據結構出發,帶領讀者深入理解線性結構、樹結構和圖結構的搜索算法,以及它們的典型應用場景。其次詳細分析全文搜索引擎工具包Lucene,包括其索引結構、分析器、搜索與排名機制,以及Lucene的底層數據結構與算法。最後,本書從搜索技術過渡到程序化廣告,介紹程序化廣告系統中的各個模塊和工作機制,包含廣告檢索、廣告庫存預測、廣告定位、廣告標簽模板、廣告實時競價、廣告實時數據、廣告事件流聚合、廣告供應鏈透明度等內容。

本書適合從事搜索技術、程序化廣告相關工作或對相關內容感興趣的軟件開發人員閱讀。在閱讀本書之前,讀者需要具備基本的編程能力。

作者簡介

杨敏,毕业于浙江大学计算机科学与技术专业,目前就职于一家专门提供互联网视频广告投放、预测和增值等解决方案的公司——Freewheel,担任广告供应方平台(Supply Side Platform,SSP)的技术负责人、软件架构师。他曾在美国道富银行、微软、Thoughtworks等公司工作,拥有丰富的程序化广告产品开发与设计经验。他曾参与或主持开发过的项目有:

·美国道富银行的普林斯顿金融系统;

·普华永道全球派遣服务软件系统;

·微软SharePoint平台的搜索系统;

·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 檢測無向圖中的環 64

1.4.8 二分圖檢測與染色算法 66

1.4.9 拓撲排序 68

1.4.10 動態規劃和遞歸之間的關系 72

1.5 小結 73

第 2 章 Lucene 基礎 75

2.1 背景 75

2.2 Lucene 與傳統關系數據庫 76

2.2.1 Lucene 與傳統關系數據庫的異同 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 動態數組 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 觸發快照的場景 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 創建自定義過濾器 226

5.3.5 過濾與查詢的區別 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 變長字節編碼 270

6.3 跳錶結構:分層有序鏈表 271

6.3.1 概述 271

6.3.2 跳錶的定義與規則 272

6.3.3 從單鏈表到跳錶 273

6.3.4 跳錶的特點 274

6.3.5 frq 索引文件中的跳錶設計 275

6.3.6 索引的設計思想:空間換時間 276

6.3.7 MultiLevelSkipListWriter 類的相關狀態 277

6.3.8 MultiLevelSkipListWriter 類的相關操作 279

6.3.9 MultiLevelSkipListReader 類的相關狀態和操作 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 程序化廣告系統的主要模塊 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