本書主要展示如何使用Elasticsearch構(gòu)建可擴(kuò)展的搜索應(yīng)用程序。書中覆蓋了Elasticsearch的主要特性,從使用不同的分析器和查詢類型進(jìn)行相關(guān)性調(diào)優(yōu),到使用聚集功能進(jìn)行實時性分析,還有地理空間搜索和文檔過濾等更多吸引人的特性。
全書共分兩個部分,*部分解釋了核心特性,內(nèi)容主要涉及Elasticsearch的介紹,數(shù)據(jù)的索引、更新和刪除,數(shù)據(jù)的搜索,數(shù)據(jù)的分析,使用相關(guān)性進(jìn)行搜索,使用聚集來探索數(shù)據(jù),文檔間的關(guān)系等;第二部分介紹每個特性工作的更多細(xì)節(jié)及其對性能和可擴(kuò)展性的影響,以便對核心功能進(jìn)行產(chǎn)品化,內(nèi)容主要涉及水平擴(kuò)展和性能提升等。此外,本書還有6個附錄(網(wǎng)上下載),提供了讀者應(yīng)該知道的特性,展示了關(guān)于地理空間搜索和聚集,如何管理Elasticsearch插件,學(xué)習(xí)在搜索結(jié)果中如何高亮查詢單詞,在生產(chǎn)環(huán)境中用來協(xié)助管理Elasticsearch的第三方的監(jiān)控工具有哪些,如何使用Percolator過濾為多個查詢匹配少量文檔,如何使用不同的建議器來實現(xiàn)自動完成的功能。
現(xiàn)代搜索看起來好像很神奇在搜索引擎中鍵入幾個單詞,搜索引擎看上去就好像知道你想要什么。有了Elasticsearch實時搜索和分析引擎,無需進(jìn)行復(fù)雜的底層編程,也無需理解高 級的數(shù)據(jù)科學(xué)算法,你就可以為用戶提供這種神奇的體驗。你只要安裝它,調(diào)試它,就可以繼續(xù)你的工作了。
本書將教讀者編寫提供專業(yè)的高質(zhì)量搜索的應(yīng)用程序的方法。隨著閱讀的深入,讀者將學(xué)會為任何應(yīng)用程序添加基本的搜索特性,通過預(yù)測性分析和相關(guān)性排序來增強(qiáng)搜索結(jié)果,并使用之前搜索中保存的數(shù)據(jù)為用戶提供定制化的體驗。這本實戰(zhàn)型的書籍聚焦在使用HTTP協(xié)議的Elasticsearch REST API。代碼片段的書寫多數(shù)是使用cURL的bash腳本,所以很容易翻譯成其他編程語言。
本書主要內(nèi)容
·什么是良好的搜索應(yīng)用?
·打造可擴(kuò)展的搜索解決方案。
·通過任何語言使用Elasticsearch 。
·配置和調(diào)優(yōu)。
對于構(gòu)建并管理面向搜索的應(yīng)用程序而言,本書是程序開發(fā)者和系統(tǒng)管理員的極 佳選擇。
作者簡介
拉杜·喬戈(Radu Gheorghe)是搜索技術(shù)顧問和軟件工程師。
馬修·李·欣曼(Matthew Lee Hinman)開發(fā)過基于云的高可用系統(tǒng)。
羅伊·羅素(Roy Russo)是預(yù)測分析方面的專家。
譯者簡介
黃申博士,現(xiàn)任LinkedIn(領(lǐng)英)資深數(shù)據(jù)科學(xué)家,畢業(yè)于上海交通大學(xué)計算機(jī)科學(xué)與工程專業(yè),師從俞勇教授。微軟學(xué)者、IBM ExtremeBlue天才計劃成員。長期專注于大數(shù)據(jù)相關(guān)的搜索、推薦、廣告以及用戶精準(zhǔn)化領(lǐng)域。曾在微軟亞洲研究院、eBay中國、沃爾瑪1號店(現(xiàn)京東1號店)和大潤發(fā)飛牛網(wǎng)擔(dān)任要職,帶團(tuán)隊完成了若干公司級的戰(zhàn)略項目。同時在國際上發(fā)表20多篇論文,并擁有10多項國際專利!队嬎銠C(jī)工程》特邀審稿專家,2016年出版了《大數(shù)據(jù)架構(gòu)商業(yè)之路》一書,廣受好評。因?qū)I(yè)界做出卓越貢獻(xiàn),獲得美國政府頒發(fā)的美國杰出人才稱號。
第一部分
第1章 Elasticsearch介紹 2
1.1 用Elasticsearch解決搜索問題 3
1.1.1 提供快速查詢 3
1.1.2 確保結(jié)果的相關(guān)性 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 擴(kuò)展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 小結(jié) 16
第2章 深入功能 17
2.1 理解邏輯設(shè)計:文檔、類型和索引 18
2.1.1 文檔 19
2.1.2 類型 20
2.1.3 索引 21
2.2 理解物理設(shè)計:節(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 回復(fù)的內(nèi)容 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指定詳細(xì)日志記錄 41
2.5.3 調(diào)整JVM設(shè)置 41
2.6 在集群中加入節(jié)點 42
2.6.1 啟動第二個節(jié)點 43
2.6.2 增加額外的節(jié)點 44
2.7 小結(jié) 45
第3章 索引、更新和刪除數(shù)據(jù) 47
3.1 使用映射來定義各種文檔 48
3.1.1 檢索和定義映射 49
3.1.2 擴(kuò)展現(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 使用預(yù)定義字段 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 關(guān)閉索引 72
3.6.4 重新索引樣本文檔 73
3.7 小結(jié) 73
第4章 搜索數(shù)據(jù) 74
4.1 搜索請求的結(jié)構(gòu) 75
4.1.1 確定搜索范圍 75
4.1.2 搜索請求的基本模塊 76
4.1.3 基于請求主體的搜索請求 78
4.1.4 理解回復(fù)的結(jié)構(gòu) 81
4.2 介紹查詢和過濾器DSL 82
4.2.1 match查詢和term過濾器 82
4.2.2 常用的基礎(chǔ)查詢和過濾器 85
4.2.3 match查詢和term過濾器 91
4.2.4 phrase_prefix查詢 92
4.3 組合查詢或復(fù)合查詢 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 將任何查詢轉(zhuǎn)變?yōu)檫^濾器 103
4.6 為任務(wù)選擇最好的查詢 104
4.7 小結(jié) 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來學(xué)習(xí)索引詞條 116
5.4 分析器、分詞器和分詞過濾器 117
5.4.1 內(nèi)置的分析器 117
5.4.2 分詞器 119
5.4.3 分詞過濾器 122
5.5 N元語法、側(cè)邊N元語法和滑動窗口 128
5.5.1 一元語法過濾器 128
5.5.2 二元語法過濾器 129
5.5.3 三元語法過濾器 129
5.5.4 設(shè)置min_gram和max_gram 129
5.5.5 側(cè)邊N元語法過濾器 129
5.5.6 N元語法的設(shè)置 130
5.5.7 滑動窗口分詞過濾器 131
5.6 提取詞干 132
5.6.1 算法提取詞干 133
5.6.2 使用字典提取詞干 133
5.6.3 重寫分詞過濾器的詞干提取 134
5.7 小結(jié) 134
第6章 使用相關(guān)性進(jìn)行搜索 136
6.1 Elasticsearch的打分機(jī)制 137
6.1.1 文檔打分是如何運(yùn)作的 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 隨機(jī) 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 小結(jié) 163
第7章 使用聚集來探索數(shù)據(jù) 164
7.1 理解聚集的具體結(jié)構(gòu) 166
7.1.1 理解聚集請求的結(jié)構(gòu) 166
7.1.2 運(yùn)行在查詢結(jié)果上的聚集 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 通過嵌套聚集獲得結(jié)果分組 190
7.4.3 使用單桶聚集 192
7.5 小結(jié) 196
第8章 文檔間的關(guān)系 197
8.1 定義文檔間關(guān)系的選項概覽 197
8.1.1 對象類型 198
8.1.2 嵌套類型 200
8.1.3 父子關(guān)系 200
8.1.4 反規(guī)范化 200
8.2 將對象作為字段值 202
8.2.1 映射和索引對象 203
8.2.2 在對象中搜索 204
8.3 嵌套類型:聯(lián)結(jié)嵌套的文檔 206
8.3.1 映射并索引嵌套文檔 207
8.3.2 搜索和聚集嵌套文檔 210
8.4 父子關(guān)系:關(guān)聯(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 應(yīng)用端的連接 234
8.7 小結(jié) 235
第二部分
第9章 向外擴(kuò)展 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 進(jìn)行輪流重啟 250
9.4.2 最小化重啟后的恢復(fù)時間 251
9.5 使用_cat API 252
9.6 擴(kuò)展策略 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 結(jié)合路由和別名 265
9.9 小結(jié) 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 使用預(yù)熱器讓緩存 熱身 296
10.4 其他的性能權(quán)衡 297
10.4.1 大規(guī)模的索引還是 昂貴的搜索 298
10.4.2 調(diào)優(yōu)腳本,要么 別用它 301
10.4.3 權(quán)衡網(wǎng)絡(luò)開銷,更少的 數(shù)據(jù)和更好的分布式 得分 305
10.4.4 權(quán)衡內(nèi)存,進(jìn)行深度 分頁 308
10.5 小結(jié) 310
第11章 管理集群 311
11.1 改善默認(rèn)的配置 311
11.1.1 索引模板 312
11.1.2 默認(rèn)的映射 315
11.2 分配的感知 318
11.2.1 基于分片的分配 318
11.2.2 強(qiáng)制性的分配感知 319
11.3 監(jiān)控瓶頸 320
11.3.1 檢查集群的健康 狀態(tài) 320
11.3.2 CPU:慢日志、熱線程和 線程池 322
11.3.3 內(nèi)存:堆的大小、字段和 過濾器緩存 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 從備份中恢復(fù) 335
11.4.4 使用資料庫插件 336
11.5 小結(jié) 337
附錄A 處理地理空間的數(shù)據(jù)(網(wǎng)上下載)
附錄B 插件(網(wǎng)上下載)
附錄C 高亮(網(wǎng)上下載)
附錄D Elasticsearch的監(jiān)控插件(網(wǎng)上下載)
附錄E 使用滲濾器將搜索顛倒過來(網(wǎng)上下載)
附錄F 為自動完成和您是指功能使用建議器(網(wǎng)上下載)