天天看點

《深入了解Elasticsearch(原書第2版)》一導讀

《深入了解Elasticsearch(原書第2版)》一導讀

前  言

歡迎來到elasticsearch的世界并閱讀本書第2版。通過閱讀本書,我們将帶領你接觸與elasticsearch緊密相關的各種話題。請注意,本書不是為初學者寫的。筆者将本書作為《elasticsearch server, second edition》的續作和姊妹篇。相對于《elasticsearch server》,本書涵蓋了很多新知識,不過你偶爾也可以在本書中發現一些引自《elasticsearch server》的内容。

本書将探讨與elasticsearch和lucene相關的多個不同主題。首先,我們以介紹lucene和elasticsearch的基本概念作為開始,帶領讀者認識elasticsearch提供的衆多查詢方式。在這裡,将涉及和查詢相關的不同主題,比如結果過濾以及如何為特定場景選擇合适的查詢方式。顯然,elasticsearch不僅僅隻有查詢功能。是以,本書還将介紹elasticsearch新加入的聚集功能,以及衆多能夠賦予被索引資料意義的特性,并設法提供更佳的使用者查詢體驗。

對大多數使用者來說,查詢和資料分析是elasticsearch最吸引人的部分,不過這些還不是我們想要探索的全部内容。是以,本書在涉及索引架構時還會試圖跟讀者探讨一些額外話題,比如如何選擇合适的分片數和副本數,如何調整分片配置設定行為等。當談論elasticsearch和lucene之間的關系時,我們還将介紹不同的打分算法、算法之間的差異、如何選擇合适的存儲機制,以及為什麼需要做此選擇。

最後,我們還将觸及elasticsearch的管理功能,将探讨發現和恢複子產品,以及對人類友好的cat api。cat api可以幫助我們快速擷取相關的運維資訊,它的傳回資料組織成一種大多數人都易于閱讀的格式,無需進行json解析。我們還将認識和使用部落節點,它能夠為我們提供在多個節點間聯合查詢的能力。

因為本書的書名,我們無法忽略與性能相關的話題,是以我們決定用整整一章來探讨性能。我們談論了文檔取值及其相關改進,還介紹了垃圾回收器的工作方式,以及在垃圾回收器未能如我們期望般工作時可以做些什麼。最後,探讨了如何擴充elasticsearch以應對高索引量和查詢量的場景。

和本書第1版一樣,我們決定以開發elasticsearch插件的話題作為本書結尾。我們将展示如何建構apache maven項目,并開發兩個不同類型的插件—自定義rest操作插件和自定義分析插件。

假如你在讀完某些主題後對其産生濃厚的興趣,那麼這本書就是适合你的。希望你在讀完後能夠喜歡這本書。

本書主要内容

第1章先介紹apache lucene的工作方式,再介紹elasticsearch的基本概念,并示範elasticsearch内部是如何工作的。

第2章描述lucene評分過程,為什麼要進行查詢改寫,什麼是查詢模闆以及如何使用查詢模闆。除此之外,還介紹了過濾器的使用,以及如何為特定場景選擇合适的查詢方式。

第3章描述了查詢二次評分、多比對控制,并介紹了用于做查詢分析的各種聚合類型。關鍵詞項聚合和最優詞項聚合可以根據所含内容片段對文檔進行歸類。除此之外,還介紹了elasticsearch的parent-child文檔關系處理,并提供了在elasticsearch中使用腳本的相關知識。

第4章覆寫了有關使用者體驗提升的相關話題。本章介紹了查詢建議(suggester),它能幫助修正查詢中的拼寫錯誤并建構高效的自動完成(autocomplete)機制。除此之外,通過實際的案例展示如何通過使用不同查詢類型和elasticsearch的其他功能來提高查詢相關性。

第5章介紹了以下技術:如何選擇合适的分片及副本數,路由是如何工作的,索引分片機制是如何工作的以及如何影響分片行為。同時介紹了什麼是查詢執行偏好,以及它是如何影響查詢執行的。

第6章描述如何修改lucene評分以及如何選擇備用的評分算法。本章也介紹了elasticsearch的準實時搜尋和索引,事務日志的使用,了解索引的段合并,以及如何調整段合并來适應應用場景。在本章最後,還将介紹elasticsearch的緩存機制和請求打斷器,以避免出現記憶體用盡的故障。

第7章介紹了什麼是發現、網關、恢複子產品,如何配置這些子產品,以及有哪些令人心煩的疑難點。還介紹了什麼是cat api,如何把資料備份到各種雲服務上(比如亞馬遜的aws和微軟的azure),以及如何從雲服務上恢複資料。最後還介紹了如何使用部落節點進行聯盟搜尋。

第8章覆寫了與elasticsearch性能相關的各種主題,從使用文檔取值來優化字段資料緩存的記憶體使用,到jvm垃圾回收器的工作原理,再到查詢基準測試,最後到如何擴充elasticsearch以适應更高的索引量和查詢量場景。

第9章通過示範如何開發你自己的rest操作插件和查詢語言分析插件來介紹elasticsearch的插件開發。

閱讀本書的必備資源

本書寫作時采用了elasticsearch的1.4.x版本,所有的範例代碼應該能在該版本下正常運作。除此之外,讀者需要一個能發送http請求的指令行工具,例如curl,該工具在絕大多數作業系統上是可用的。請記住,本書的所有範例都使用了curl。如果讀者想使用其他工具,請注意檢查請求的格式,以保證你所選擇的工具能正确解析它。

除此之外,為了運作第9章的範例,需要讀者的機器上已安裝了jdk,并且需要一個編輯器來開發相關代碼(或者類似eclipse的java ide)。另外,還要求使用apache maven進行代碼的管理與建構。

本書的目标讀者

本書的目标讀者是那些對elasticsearch基本概念已經很熟悉但是又想深入了解其本身,同時也對apache lucene、jvm垃圾收集感興趣的elasticsearch使用者和發燒友。除此之外,想了解如何改進查詢相關性、如何使用elasticsearch java api、如何編寫自定義插件的讀者,也會發現本書的趣味性和實用性。

如果你是elasticsearch的初學者,連查詢和索引這些基本概念都不熟悉,那麼你會發現本書的絕大多數章節難以了解,因為這些内容假定讀者已經有相關背景知識。如果是這種情況,建議參考packt出版社出版的另一本關于elasticsearch的圖書—《elasticsearch server, second edition》。

第3章 不隻是文本搜尋

3.1 查詢二次評分

3.1.1 什麼是查詢二次評分

3.1.2 一個查詢例子

3.1.3 二次評分查詢的結構

3.1.4 二次評分參數

3.1.5 總結

3.2 多比對控制

3.3 重要詞項聚合

3.3.1 一個例子

3.3.2 選擇重要詞項

3.3.3 多值分析

3.3.4 額外的配置

3.3.5 使用限制

3.4 文檔分組

3.4.1 top_hits聚合

3.4.2 一個例子

3.5 文檔關系

3.5.1 對象類型

3.5.2 嵌套文檔

3.5.3 parent-child關系

3.5.4 其他解決方案

3.6 elasticsearch各版本中腳本的變化

3.6.1 腳本變遷

3.6.2 groovy簡單介紹

3.6.3 全文檢索中的腳本

3.6.4 lucene表達式

3.7 小結

第4章 改善使用者搜尋體驗

4.1 改正使用者拼寫錯誤

4.1.1 測試資料

4.1.2 深入技術細節

4.1.3 suggester

4.2 改善查詢相關性

4.2.1 資料

4.2.2 改善相關性的探索之旅

4.3 小結

第5章 分布式索引架構

5.1 選擇合适的分片和副本數

5.1.1 分片和過度配置設定

5.1.2 一個過度配置設定的正面例子

5.1.3 多分片與多索引

5.1.4 副本

5.2 路由

5.2.1 分片和資料

5.2.2 測試路由功能

5.2.3 索引時使用路由

5.2.4 别名

5.2.5 多個路由值

5.3 調整預設分片的配置設定行為

5.3.1 部署意識

5.3.2 過濾

5.3.3 運作時更新配置設定政策

5.3.4 确定每個節點允許的總分片數

5.3.5 确定每個實體機器允許的總分片數

5.4 查詢執行偏好

5.5 小結

第6章 底層索引控制

6.1 改變apache lucene的評分方式

6.1.1 可用的相似度模型

6.1.2 為每字段配置相似度模型

6.1.3 相似度模型配置

6.1.4 選擇預設的相似度模型

6.2 選擇适當的目錄實作—store子產品

6.3 準實時、送出、更新及事務日志

6.3.1 索引更新及更新送出

6.3.2 事務日志

6.3.3 準實時讀取

6.4 控制索引合并

6.4.1 選擇正确的合并政策

6.4.2 合并政策配置

6.4.3 排程

6.5 關于i/o調節

6.5.1 控制i/o節流

6.5.2 配置

6.6 了解elasticsearch緩存

6.6.1 過濾器緩存

6.6.2 字段資料緩存

6.6.3 查詢分片緩存

6.6.4 使用circuit breaker

6.6.5 清除緩存

6.7 小結

第7章 管理elasticsearch

7.1 發現和恢複子產品

7.1.1 發現子產品的配置

7.1.2 主節點

7.1.3 網關和恢複子產品的配置

7.1.4 索引恢複api

7.2 使用人類友好的cat api

7.2.1 基礎知識

7.2.2 使用cat api

7.2.3 一些例子

7.3 備份

7.4 聯盟搜尋

7.4.1 測試用的叢集

7.4.2 建立部落節點

7.4.3 通過部落節點讀取資料

7.4.4 通過部落節點寫入資料

7.4.5 處理索引沖突

7.4.6 屏蔽寫操作

7.5 小結

第8章 提高性能

8.1 使用doc values來優化查詢

8.1.1 字段緩存存在的問題

8.1.2 使用doc values的例子

8.2 了解垃圾回收器

8.2.1 java記憶體

8.2.2 解決垃圾回收問題

8.2.3 在類unix系統上避免記憶體交換

8.3 對查詢做基準測試

8.3.1 為基準測試配置叢集

8.3.2 進行基準測試

8.3.3 控制運作中的基準測試

8.4 熱點線程

8.4.1 熱點線程的使用說明

8.4.2 熱點線程api的響應

8.5 擴充elasticsearch

8.5.1 垂直擴充

8.5.2 水準擴充

8.5.3 在高負載的場景下使用elasticsearch

8.6 小結

第9章 開發elasticsearch插件

9.1 建立maven項目

9.2 了解基本知識

9.2.1 maven java項目的結構

9.2.2 pom的理念

9.2.3 執行建構過程

9.2.4 引入maven裝配插件

9.3 建立自定義rest行為

9.3.1 設定

9.3.2 實作細節

9.4 建立自定義分析插件

9.4.1 實作細節

9.4.2 測試自定義分析插件

9.5 小結