本書主要展示如何使用Elasticsearch構建可擴展的搜索應用程序。書中覆蓋了Elasticsearch的主要特性,從使用不同的分析器和查詢類型進行相關性調優(yōu),到使用聚集功能進行實時性分析,還有地理空間搜索和文檔過濾等更多吸引人的特性。
全書共分兩個部分,*部分解釋了核心特性,內容主要涉及Elasticsearch的介紹,數(shù)據(jù)的索引、更新和刪除,數(shù)據(jù)的搜索,數(shù)據(jù)的分析,使用相關性進行搜索,使用聚集來探索數(shù)據(jù),文檔間的關系等;第二部分介紹每個特性工作的更多細節(jié)及其對性能和可擴展性的影響,以便對核心功能進行產品化,內容主要涉及水平擴展和性能提升等。此外,本書還有6個附錄(網(wǎng)上下載),提供了讀者應該知道的特性,展示了關于地理空間搜索和聚集,如何管理Elasticsearch插件,學習在搜索結果中如何高亮查詢單詞,在生產環(huán)境中用來協(xié)助管理Elasticsearch的第三方的監(jiān)控工具有哪些,如何使用Percolator過濾為多個查詢匹配少量文檔,如何使用不同的建議器來實現(xiàn)自動完成的功能。
現(xiàn)代搜索看起來好像很神奇在搜索引擎中鍵入幾個單詞,搜索引擎看上去就好像知道你想要什么。有了Elasticsearch實時搜索和分析引擎,無需進行復雜的底層編程,也無需理解高 級的數(shù)據(jù)科學算法,你就可以為用戶提供這種神奇的體驗。你只要安裝它,調試它,就可以繼續(xù)你的工作了。
本書將教讀者編寫提供專業(yè)的高質量搜索的應用程序的方法。隨著閱讀的深入,讀者將學會為任何應用程序添加基本的搜索特性,通過預測性分析和相關性排序來增強搜索結果,并使用之前搜索中保存的數(shù)據(jù)為用戶提供定制化的體驗。這本實戰(zhàn)型的書籍聚焦在使用HTTP協(xié)議的Elasticsearch REST API。代碼片段的書寫多數(shù)是使用cURL的bash腳本,所以很容易翻譯成其他編程語言。
本書主要內容
·什么是良好的搜索應用?
·打造可擴展的搜索解決方案。
·通過任何語言使用Elasticsearch 。
·配置和調優(yōu)。
對于構建并管理面向搜索的應用程序而言,本書是程序開發(fā)者和系統(tǒng)管理員的極 佳選擇。
作者簡介
拉杜·喬戈(Radu Gheorghe)是搜索技術顧問和軟件工程師。
馬修·李·欣曼(Matthew Lee Hinman)開發(fā)過基于云的高可用系統(tǒng)。
羅伊·羅素(Roy Russo)是預測分析方面的專家。
譯者簡介
黃申博士,現(xiàn)任LinkedIn(領英)資深數(shù)據(jù)科學家,畢業(yè)于上海交通大學計算機科學與工程專業(yè),師從俞勇教授。微軟學者、IBM ExtremeBlue天才計劃成員。長期專注于大數(shù)據(jù)相關的搜索、推薦、廣告以及用戶精準化領域。曾在微軟亞洲研究院、eBay中國、沃爾瑪1號店(現(xiàn)京東1號店)和大潤發(fā)飛牛網(wǎng)擔任要職,帶團隊完成了若干公司級的戰(zhàn)略項目。同時在國際上發(fā)表20多篇論文,并擁有10多項國際專利!队嬎銠C工程》特邀審稿專家,2016年出版了《大數(shù)據(jù)架構商業(yè)之路》一書,廣受好評。因對業(yè)界做出卓越貢獻,獲得美國政府頒發(fā)的美國杰出人才稱號。
第一部分
第1章 Elasticsearch介紹 2
1.1 用Elasticsearch解決搜索問題 3
1.1.1 提供快速查詢 3
1.1.2 確保結果的相關性 4
1.1.3 超越精確匹配 5
1.2 探索典型的Elasticsearch使用案例 6
1.2.1 將Elasticsearch作為主要的后端系統(tǒng) 7
1.2.2 將Elasticsearch添加到現(xiàn)有的系統(tǒng) 7
1.2.3 將Elasticsearch和現(xiàn)有工具一同使用 8
1.2.4 Elasticsearch的主要特性 10
1.2.5 擴展Lucene的功能 10
1.2.6 在Elasticsearch中組織數(shù)據(jù) 12
1.2.7 安裝Java語言 12
1.2.8 下載并啟動Elasticsearch 13
1.2.9 驗證是否工作 14
1.3 小結 16
第2章 深入功能 17
2.1 理解邏輯設計:文檔、類型和索引 18
2.1.1 文檔 19
2.1.2 類型 20
2.1.3 索引 21
2.2 理解物理設計:節(jié)點和分片 21
2.2.1 創(chuàng)建擁有一個或多個節(jié)點的集群 22
2.2.2 理解主分片和副本分片 23
2.2.3 在集群中分發(fā)分片 25
2.2.4 分布式索引和搜索 26
2.3 索引新數(shù)據(jù) 27
2.3.1 通過cURL索引一篇文檔 28
2.3.2 創(chuàng)建索引和映射類型 30
2.3.3 通過代碼樣例索引文檔 31
2.4 搜索并獲取數(shù)據(jù) 32
2.4.1 在哪里搜索 33
2.4.2 回復的內容 33
2.4.3 如何搜索 36
2.4.4 通過ID獲取文檔 39
2.5 配置Elasticsearch 40
2.5.1 在elasticsearch.yml中指定集群的名稱 40
2.5.2 通過logging.yml指定詳細日志記錄 41
2.5.3 調整JVM設置 41
2.6 在集群中加入節(jié)點 42
2.6.1 啟動第二個節(jié)點 43
2.6.2 增加額外的節(jié)點 44
2.7 小結 45
第3章 索引、更新和刪除數(shù)據(jù) 47
3.1 使用映射來定義各種文檔 48
3.1.1 檢索和定義映射 49
3.1.2 擴展現(xiàn)有的映射 50
3.2 用于定義文檔字段的核心類型 51
3.2.1 字符串類型 52
3.2.2 數(shù)值類型 54
3.2.3 日期類型 55
3.2.4 布爾類型 56
3.3 數(shù)組和多字段 56
3.3.1 數(shù)組 56
3.3.2 多字段 57
3.4 使用預定義字段 58
3.4.1 控制如何存儲和搜索文檔 59
3.4.2 識別文檔 61
3.5 更新現(xiàn)有文檔 63
3.5.1 使用更新API 64
3.5.2 通過版本來實現(xiàn)并發(fā)控制 66
3.6 刪除數(shù)據(jù) 69
3.6.1 刪除文檔 70
3.6.2 刪除索引 71
3.6.3 關閉索引 72
3.6.4 重新索引樣本文檔 73
3.7 小結 73
第4章 搜索數(shù)據(jù) 74
4.1 搜索請求的結構 75
4.1.1 確定搜索范圍 75
4.1.2 搜索請求的基本模塊 76
4.1.3 基于請求主體的搜索請求 78
4.1.4 理解回復的結構 81
4.2 介紹查詢和過濾器DSL 82
4.2.1 match查詢和term過濾器 82
4.2.2 常用的基礎查詢和過濾器 85
4.2.3 match查詢和term過濾器 91
4.2.4 phrase_prefix查詢 92
4.3 組合查詢或復合查詢 93
4.3.1 bool查詢 93
4.3.2 bool過濾器 96
4.4 超越match和過濾器查詢 98
4.4.1 range查詢和過濾器 98
4.4.2 prefix查詢和過濾器 99
4.4.3 wildcard查詢 100
4.5 使用過濾器查詢字段的存在性 102
4.5.1 exists過濾器 102
4.5.2 missing過濾器 102
4.5.3 將任何查詢轉變?yōu)檫^濾器 103
4.6 為任務選擇最好的查詢 104
4.7 小結 105
第5章 分析數(shù)據(jù) 106
5.1 什么是分析 106
5.1.1 字符過濾 107
5.1.2 切分為分詞 108
5.1.3 分詞過濾器 108
5.1.4 分詞索引 108
5.2 為文檔使用分析器 109
5.2.1 在索引創(chuàng)建時增加分析器 109
5.2.2 在Elasticsearch的配置中添加分析器 111
5.2.3 在映射中指定某個字段的分析器 112
5.3 使用分析API來分析文本 113
5.3.1 選擇一個分析器 114
5.3.2 通過組合即興地創(chuàng)建分析器 115
5.3.3 基于某個字段映射的分析 115
5.3.4 使用詞條向量API來學習索引詞條 116
5.4 分析器、分詞器和分詞過濾器 117
5.4.1 內置的分析器 117
5.4.2 分詞器 119
5.4.3 分詞過濾器 122
5.5 N元語法、側邊N元語法和滑動窗口 128
5.5.1 一元語法過濾器 128
5.5.2 二元語法過濾器 129
5.5.3 三元語法過濾器 129
5.5.4 設置min_gram和max_gram 129
5.5.5 側邊N元語法過濾器 129
5.5.6 N元語法的設置 130
5.5.7 滑動窗口分詞過濾器 131
5.6 提取詞干 132
5.6.1 算法提取詞干 133
5.6.2 使用字典提取詞干 133
5.6.3 重寫分詞過濾器的詞干提取 134
5.7 小結 134
第6章 使用相關性進行搜索 136
6.1 Elasticsearch的打分機制 137
6.1.1 文檔打分是如何運作的 137
6.1.2 詞頻 137
6.1.3 逆文檔頻率 138
6.1.4 Lucene評分公式 138
6.2 其他打分方法 139
6.3 boosting 141
6.3.1 索引期間的boosting 142
6.3.2 查詢期間的boosting 142
6.3.3 跨越多個字段的查詢 143
6.4 使用解釋來理解文檔是如何被評分的 144
6.5 使用查詢再打分來減小評分操作的性能影響 147
6.6 使用function_score來定制得分 148
6.6.1 weight函數(shù) 149
6.6.2 合并得分 150
6.6.3 field_value_factor函數(shù) 151
6.6.4 腳本 152
6.6.5 隨機 152
6.6.6 衰減函數(shù) 153
6.6.7 配置選項 155
6.7 嘗試一起使用它們吧 156
6.8 使用腳本來排序 157
6.9 字段數(shù)據(jù) 158
6.9.1 字段數(shù)據(jù)緩存 158
6.9.2 字段數(shù)據(jù)用在哪里 159
6.9.3 管理字段數(shù)據(jù) 160
6.10 小結 163
第7章 使用聚集來探索數(shù)據(jù) 164
7.1 理解聚集的具體結構 166
7.1.1 理解聚集請求的結構 166
7.1.2 運行在查詢結果上的聚集 168
7.1.3 過濾器和聚集 169
7.2 度量聚集 170
7.2.1 統(tǒng)計數(shù)據(jù) 171
7.2.2 高級統(tǒng)計 172
7.2.3 近似統(tǒng)計 173
7.3 多桶型聚集 176
7.3.1 terms聚集 177
7.3.2 range聚集 183
7.3.3 histogram聚集 185
7.4 嵌套聚集 187
7.4.1 嵌套多桶聚集 189
7.4.2 通過嵌套聚集獲得結果分組 190
7.4.3 使用單桶聚集 192
7.5 小結 196
第8章 文檔間的關系 197
8.1 定義文檔間關系的選項概覽 197
8.1.1 對象類型 198
8.1.2 嵌套類型 200
8.1.3 父子關系 200
8.1.4 反規(guī)范化 200
8.2 將對象作為字段值 202
8.2.1 映射和索引對象 203
8.2.2 在對象中搜索 204
8.3 嵌套類型:聯(lián)結嵌套的文檔 206
8.3.1 映射并索引嵌套文檔 207
8.3.2 搜索和聚集嵌套文檔 210
8.4 父子關系:關聯(lián)分隔的文檔 216
8.4.1 子文檔的索引、更新和刪除 218
8.4.2 在父文檔和子文檔中搜索 220
8.5 反規(guī)范化:使用冗余的數(shù)據(jù)管理 227
8.5.1 反規(guī)范化的使用案例 228
8.5.2 索引、更新和刪除反規(guī)范化的數(shù)據(jù) 230
8.5.3 查詢反規(guī)范化的數(shù)據(jù) 233
8.6 應用端的連接 234
8.7 小結 235
第二部分
第9章 向外擴展 238
9.1 向Elasticsearch集群加入節(jié)點 238
9.2 發(fā)現(xiàn)其他Elasticsearch節(jié)點 241
9.2.1 通過廣播來發(fā)現(xiàn) 241
9.2.2 通過單播來發(fā)現(xiàn) 242
9.2.3 選舉主節(jié)點和識別錯誤 243
9.2.4 錯誤的識別 244
9.3 刪除集群中的節(jié)點 245
9.4 升級Elasticsearch的節(jié)點 250
9.4.1 進行輪流重啟 250
9.4.2 最小化重啟后的恢復時間 251
9.5 使用_cat API 252
9.6 擴展策略 254
9.6.1 過度分片 254
9.6.2 將數(shù)據(jù)切分為索引和分片 255
9.6.3 最大化吞吐量 256
9.7 別名 257
9.7.1 什么是別名 258
9.7.2 別名的創(chuàng)建 259
9.8 路由 261
9.8.1 為什么使用路由 261
9.8.2 路由策略 262
9.8.3 使用_search_shards API來決定搜索在哪里執(zhí)行 263
9.8.4 配置路由 265
9.8.5 結合路由和別名 265
9.9 小結 267
第10章 提升性能 268
10.1 合并請求 269
10.1.1 批量索引、更新和 刪除 269
10.1.2 多條搜索和多條獲取 API接口 273
10.2 優(yōu)化Lucene分段的 處理 276
10.2.1 刷新和沖刷的閾值 276
10.2.2 合并以及合并策略 279
10.2.3 存儲和存儲限流 282
10.3 充分利用緩存 285
10.3.1 過濾器和過濾器 緩存 285
10.3.2 分片查詢緩存 291
10.3.3 JVM堆和操作系統(tǒng) 緩存 293
10.3.4 使用預熱器讓緩存 熱身 296
10.4 其他的性能權衡 297
10.4.1 大規(guī)模的索引還是 昂貴的搜索 298
10.4.2 調優(yōu)腳本,要么 別用它 301
10.4.3 權衡網(wǎng)絡開銷,更少的 數(shù)據(jù)和更好的分布式 得分 305
10.4.4 權衡內存,進行深度 分頁 308
10.5 小結 310
第11章 管理集群 311
11.1 改善默認的配置 311
11.1.1 索引模板 312
11.1.2 默認的映射 315
11.2 分配的感知 318
11.2.1 基于分片的分配 318
11.2.2 強制性的分配感知 319
11.3 監(jiān)控瓶頸 320
11.3.1 檢查集群的健康 狀態(tài) 320
11.3.2 CPU:慢日志、熱線程和 線程池 322
11.3.3 內存:堆的大小、字段和 過濾器緩存 326
11.3.4 操作系統(tǒng)緩存 330
11.3.5 存儲限流 330
11.4 備份你的數(shù)據(jù) 331
11.4.1 快照API 331
11.4.2 將數(shù)據(jù)備份到共享的文件系統(tǒng) 332
11.4.3 從備份中恢復 335
11.4.4 使用資料庫插件 336
11.5 小結 337
附錄A 處理地理空間的數(shù)據(jù)(網(wǎng)上下載)
附錄B 插件(網(wǎng)上下載)
附錄C 高亮(網(wǎng)上下載)
附錄D Elasticsearch的監(jiān)控插件(網(wǎng)上下載)
附錄E 使用滲濾器將搜索顛倒過來(網(wǎng)上下載)
附錄F 為自動完成和您是指功能使用建議器(網(wǎng)上下載)