《Elasticsearch in Action》书评与作者访谈
如今,企業(yè)淹沒在系統(tǒng)生成的浩瀚數(shù)據(jù)流當(dāng)中。大數(shù)據(jù)技術(shù)業(yè)已集中在如何存儲(chǔ)和處理這些海量的數(shù)據(jù)上。雖然離線數(shù)據(jù)的批處理非常重要,但我們通常需要對(duì)相應(yīng)的實(shí)時(shí)數(shù)據(jù)做出明智的判斷。這就是搜索引擎的用武之地,siteber.com將其描述為“最具活力的行業(yè)”:\
\搜索引擎行業(yè)在過去幾年的成長(zhǎng),已經(jīng)足以鞏固其在美國(guó)最具創(chuàng)新性行業(yè)之一的地位。
\于是乎,Elasticsearch和Apache Solr這兩款當(dāng)世領(lǐng)先的開源搜索引擎,正在享受著更廣泛的使用,吸引著更多人的關(guān)注。Gheorghe、Hinman和Russo所著的新書《Elasticsearch in Action》是一本非常好的書,簡(jiǎn)潔地一步步介紹了搜索,解釋了Elasticsearch是如何實(shí)現(xiàn)搜索功能的,并提供很多代碼示例。這本書還深入講述了Elasticsearch的管理和配置,強(qiáng)調(diào)了索引和搜索性能之間的權(quán)衡。\
這本書的主要內(nèi)容分為兩部分:“核心功能”和“高級(jí)功能”,隨后是幾個(gè)附錄,覆蓋了非常重要但不通用的功能(只適用于一些特殊的應(yīng)用場(chǎng)景)。\
本書的第一部分描述了Elasticsearch核心構(gòu)建塊及其功能。覆蓋了Elasticsearch建模和索引數(shù)據(jù)的主要功能和方法,它們將用于支持基于應(yīng)用系統(tǒng)的查詢和分析。\
- 第一章介紹了通用搜索引擎的功能,及其在Elasticsearch中的實(shí)現(xiàn)。這章的最后介紹了Elasticsearch的安裝,用于運(yùn)行全書提供的示例。 \
- 第二章講述了Elasticsearch服務(wù)器中的數(shù)據(jù)組織,包括邏輯數(shù)據(jù)模型(搜索應(yīng)用與Elasticsearch交互的方式)和物理布局(服務(wù)器內(nèi)部處理數(shù)據(jù)的方式)。接下來,展示了這種數(shù)據(jù)模型是如何運(yùn)用于典型的操作場(chǎng)景之中,即索引文檔、查詢文檔、通過聚合分析數(shù)據(jù),并水平擴(kuò)展到多個(gè)節(jié)點(diǎn)上。 \
- 第三章詳述了從Elasticsearch讀寫數(shù)據(jù)和維護(hù)數(shù)據(jù)的細(xì)節(jié):索引、更新和刪除文檔。通過分析文檔的字段,詳述了索引過程;向讀者講述了當(dāng)我們寫入時(shí),都包含哪些內(nèi)容,會(huì)發(fā)生什么事情。 \
- 第四章詳述了全文搜索,包括主要的查詢器和過濾器、它們的內(nèi)部工作機(jī)制,以及各種搜索方法的權(quán)衡。本章的最后,演示了一些最常用的過濾器和查詢器,并解釋了它們對(duì)于不同應(yīng)用場(chǎng)景的適用性。 \
- 第五章闡述了如何將文檔和查詢器中的文本,分析和拆分為用于搜索的詞條。本章介紹了Elasticsearch提供的不同類型的分析器,并說明了如何構(gòu)建我們自己的分析器,以充分利用Elasticsearch的全文搜索潛能。本章還介紹了用于解決復(fù)雜搜索業(yè)務(wù)的Ngrams、Shingles和Stemming。 \
- 第六章關(guān)注于相關(guān)性計(jì)算,也就是打分(score),它定義了文檔對(duì)原始查詢的相關(guān)性。本章描述了影響文檔打分的因素及其維護(hù)方式——使用不同的打分算法、調(diào)整指定查詢器或者字段的boost值。本章還展示了Elasticsearch中,用于計(jì)算打分的API。 \
- 第七章展示了如何使用聚合來執(zhí)行實(shí)時(shí)數(shù)據(jù)分析。在Elasticsearch中的具體做法是,加載文檔、匹配搜索條件,以及執(zhí)行各種排序計(jì)算,比如統(tǒng)計(jì)字符類型字段中詞項(xiàng)的數(shù)量,或者計(jì)算數(shù)值類型字段的平均值。聚合被分為兩種:度量和桶。度量聚合是指對(duì)一組文檔進(jìn)行靜態(tài)分析,得到度量值,比如最小值、最大值、均方差等。桶式聚合將匹配的文檔拆分進(jìn)一個(gè)或多個(gè)桶容器,然后告訴你每個(gè)桶里有多少文檔。 \
- 第八章是第一部分的最后一章,講述了Elasticsearch對(duì)關(guān)系的支持。本章討論了Elasticsearch提供的處理關(guān)系的幾種常見方法,包括對(duì)象類型、嵌套文檔、父子關(guān)系和一般的非規(guī)范化。同時(shí),說明了如何使用每一種方法,以及它的優(yōu)點(diǎn)和缺點(diǎn)。
本書的第二部分講述了如何在生產(chǎn)環(huán)境中使用Elasticsearch。書中提供了每種功能的工作原理,及其對(duì)性能和穩(wěn)定性的影響:\
- 第九章講述了水平擴(kuò)展Elasticsearch到多個(gè)節(jié)點(diǎn)。包括增加、刪除、解除節(jié)點(diǎn)、選舉Master的過程和分片遷移的機(jī)制。還深入分析了擴(kuò)展的策略,包括索引分片和副本的最佳實(shí)踐,比如,使用Oversharding或者基于時(shí)間的索引來確保當(dāng)前的設(shè)計(jì)可以處理明年的數(shù)據(jù)。此外,還說明了如何使用索引別名和路由來提高集群的靈活性和可擴(kuò)展性。在本章的最后,演示了如何使用Elasticsearch的API展示集群的狀態(tài)和健康狀況。 \
- 第十章講述了多種提高集群性能的辦法。首先是如何將多個(gè)請(qǐng)求,比如index、update、delete、get和search合并成一次HTTP調(diào)用。這種分組通過最小化網(wǎng)絡(luò)往返流量,可以大幅提高應(yīng)用的性能。接著是Elasticsearch如何處理Lucene(底層搜索庫(kù))段:如何設(shè)置讀寫的刷新(refresh和flush)、合并策略和存儲(chǔ),這些設(shè)置對(duì)索引和搜索性能有何影響,以及在索引和搜索之間性能調(diào)優(yōu)的權(quán)衡。本章的最后,討論了影響Elasticsearch速度的一個(gè)重要的因素,緩存。詳述了過濾器緩存的細(xì)節(jié)和最佳實(shí)踐。還講述了分片查詢緩存,以及如何在預(yù)留足夠的空間給Elasticsearch堆空間的同時(shí),給操作系統(tǒng)足夠的空間去緩存索引。 \
- 第十一章講述了監(jiān)控和管理生產(chǎn)集群。包括額外的設(shè)置方法、簡(jiǎn)化集群管理,以及監(jiān)控生產(chǎn)環(huán)境必要的度量指標(biāo)。最后,討論了備份和恢復(fù)一個(gè)數(shù)據(jù)節(jié)點(diǎn)。
六個(gè)附錄包含了有關(guān)Elasticsearch的更多信息:\
- 附錄A是關(guān)于地理空間搜索的。它可以為應(yīng)用帶來位置感知能力。Elasticsearch支持存儲(chǔ)位置信息(點(diǎn)和多邊形)和通用的空間操作,比如兩點(diǎn)間距離、圖形包含點(diǎn)、圖形間重疊等計(jì)算。附錄演示了如何在搜索中使用這一功能。 \
- 附錄B是講如何管理Elasticsearch插件的。插件是一種開箱即用的,能為Elasticsearch帶來擴(kuò)展和增強(qiáng)功能的強(qiáng)大方式。附錄中介紹了兩種類型的插件。一種是site插件,沒有額外的功能,只是為Elasticsearch提供了網(wǎng)頁(yè)服務(wù)。另一種是code插件,可以是任何包含JVM代碼、能被Elasticsearch執(zhí)行的插件。附錄講述了如何安裝、使用和卸載插件。 \
- 附錄C是關(guān)于Highlighting選項(xiàng)及其實(shí)現(xiàn)的。Highlighting指示為什么文檔出現(xiàn)再查詢結(jié)果中,匹配的詞項(xiàng)被加上強(qiáng)調(diào)樣式,讓用戶感受到文檔是說什么的,以及和查詢之間的關(guān)系。 \
- 附錄D是關(guān)于監(jiān)控插件的。Elasticsearch社區(qū)提供了很多監(jiān)控插件,可以通過引人入勝的圖形界面,更容易地管理集群的狀態(tài)、索引,以及執(zhí)行查詢。 \
- 附錄E是關(guān)于如何使用Elasticsearch滲濾器(percolator)的。滲濾器通常被定義為『搜索倒置』。滲濾器索引的是查詢信息而不是索引文檔。將查詢注冊(cè)并存儲(chǔ)到內(nèi)存當(dāng)中,以便日后快速執(zhí)行。使用滲濾器時(shí),我們發(fā)送給Elasticsearch的是文檔,而不是查詢信息。這被稱為滲濾文檔,基本上會(huì)對(duì)其索引到小內(nèi)存索引上。Elasticsearch根據(jù)小索引從已然注冊(cè)的查詢信息中查詢,并返回匹配的查詢信息。 \
- 最后,附錄F是關(guān)于建議器(suggester)的。附錄解釋了如何使用不同的建議器實(shí)現(xiàn)用戶意圖的自動(dòng)補(bǔ)全功能。這里所描述的基本功能,包括詞項(xiàng)和短語(yǔ)的建議、補(bǔ)全和上下文的建議。附錄描述了各種建議器和Elasticsearch中與此功能相關(guān)的API。
Manning出版社為InfoQ的讀者提供了這本書的第八章節(jié)選,“文檔之間的關(guān)系”。\
InfoQ采訪了本書的作者,一起討論更多關(guān)于Elasticsearch的實(shí)現(xiàn)和使用的信息。\
InfoQ:本書中,在討論典型Elasticsearch用例時(shí),你們提出的一個(gè)選項(xiàng)是“增加Elasticsearch到現(xiàn)有系統(tǒng)中”。這個(gè)選項(xiàng)假定增加Elasticsearch到現(xiàn)有的數(shù)據(jù)存儲(chǔ)系統(tǒng)。由于Elasticsearch的數(shù)據(jù)可用性有延遲,這可能導(dǎo)致在不同的存儲(chǔ)系統(tǒng)中,產(chǎn)生數(shù)據(jù)之間的競(jìng)賽條件。特別是當(dāng)數(shù)據(jù)被刪除的時(shí)候,Elasticsearch仍然會(huì)返回查詢結(jié)果。關(guān)于如何應(yīng)對(duì)這樣的情況,有什么好的建議嗎?\
\Roy Russo:這種場(chǎng)景的最簡(jiǎn)回答是在應(yīng)用層面管理整個(gè)過程,將分別從不同的數(shù)據(jù)存儲(chǔ)系統(tǒng)中刪除,封裝為一個(gè)try-catch代碼塊,就像我們執(zhí)行一次寫操作。因此,第一步是調(diào)用Elasticsearch刪除記錄,然后調(diào)用主數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn)。如果任何階段失敗了,要處理異常邏輯。這里沒有事務(wù)可用,因此異常處理需要手動(dòng)回滾。\
因?yàn)槲宜娺^的最常用的Elasticsearch使用是基于時(shí)間序列的數(shù)據(jù),這種場(chǎng)景并不常見。除非在某種罕見環(huán)境中,大多數(shù)軟件沒有規(guī)律地從時(shí)間序列存儲(chǔ)中刪除記錄。還有一個(gè)辦法是使用Elasticsearch作為單獨(dú)的數(shù)據(jù)存儲(chǔ)系統(tǒng),但是這將帶來其他健康方面的討論,我不想陷于此處。
\InfoQ:在Otis Gospodneti?所寫的Elasticsearch對(duì)比Solr的文章中說,相比控制在一家公司手中的Elasticsearch而言,Solr更加開源。你同意這種評(píng)價(jià)嗎,這對(duì)Elasticsearch用戶來說是個(gè)問題嗎?\
\Roy Russo:首先,我得說自己是Otis在Sematext所做成就的粉絲,但是我不同意他的觀點(diǎn)。兩個(gè)項(xiàng)目都是以Apache Software許可分發(fā)的,它們都接受來自社區(qū)的提交,受益于透明的缺陷、pull 請(qǐng)求和討論。任何情況下,給出一個(gè)專業(yè)的開源軟件和一個(gè)業(yè)余的開源軟件供選擇,留給讀者去選擇哪個(gè)最適合他的下一次關(guān)鍵的部署。\
Elasticsearch用戶受益于一個(gè)資金雄厚的公司提供的支持服務(wù)、插件和輔助產(chǎn)品,比如:Watcher,一種告警裝置、Shield,支持認(rèn)證和授權(quán),以及與 Hadoop集成。在很短的時(shí)間里,Elastic已經(jīng)將這個(gè)開源項(xiàng)目打造成一款產(chǎn)品。這里有一個(gè)區(qū)別,因?yàn)橛幸患夜驹隍?qū)動(dòng)產(chǎn)品,因此增加了質(zhì)量保證流程、產(chǎn)品管理以決定哪些功能被添加、工藝路線圖,以及結(jié)構(gòu)化的工程團(tuán)隊(duì)做具體執(zhí)行。我目前的角色是在關(guān)鍵任務(wù)的情況下部署大型集群、熟知這款由一個(gè)財(cái)務(wù)健康、專業(yè)的工程師團(tuán)隊(duì)所支持的產(chǎn)品。
\InfoQ: Elasticsearch集群的每一個(gè)節(jié)點(diǎn)都提供了REST API端點(diǎn),Elasticsearch是否提供了負(fù)載均衡的實(shí)現(xiàn),以確保某個(gè)客戶端不會(huì)壓垮某一節(jié)點(diǎn)?\
\Roy Russo:雖然每個(gè)節(jié)點(diǎn)可以靈活地配置為不同的節(jié)點(diǎn)類型(Master、Client、Data)作為不完全解決方案,但是確實(shí)需要一個(gè)容錯(cuò)系統(tǒng),我建議用戶在Elasticsearch前面使用他們自己的負(fù)載均衡器。Nginx常用于負(fù)載均衡/反向代理。因此,有很多的教程和示例在線演示不同的負(fù)載均衡方案(輪詢、最后連接等等),甚至是使用Nginx為指定的API端點(diǎn)或者HTTP方法做重定向(認(rèn)證/授權(quán))。
\InfoQ:在這本書中,你們只展示了如何使用REST API操作Elasticsearch。與此同時(shí),還存在很多Elasticsearch的Java客戶端。有什么好的推薦嗎?\
\Roy Russo:就全功能的實(shí)現(xiàn)而言,官方提供的Java客戶端是最好的選擇。使用官方的客戶端,你的軟件不會(huì)通過REST API通信,而是扮演一個(gè)正在加入集群的額外節(jié)點(diǎn)。以此方式附加到集群的好處是省去了每次請(qǐng)求中額外的跳(hop),因?yàn)椴僮鲿?huì)被自動(dòng)路由到相關(guān)的節(jié)點(diǎn)。對(duì)于Spring用戶來說,Spring Data Elasticsearch可以完美地處理這些,通過在ORM中增加一些方便的屬性即可。Spring Data Elasticsearch以依賴包的方式內(nèi)置了官方的Elasticsearch Java客戶端,因此它的行為和使用Spring Data帶來的益處一致。
\InfoQ:父子關(guān)系實(shí)現(xiàn)上的描述稍微令人困惑。首先,你說父文檔的索引過程不受到任何特殊影響,但子文檔必須參考的父文檔。你又說一個(gè)子文檔參考一個(gè)父文檔。我會(huì)認(rèn)為這是指一個(gè)ID引用,但你后面又說,父文檔可以在以后添加。因此,在這種情況下,如何指定引用呢?此外,你后面又談到了父文檔中有子文檔的字段。這個(gè)字段是何時(shí)填充的呢?\
\Lee Hinman:子文檔中對(duì)父文檔的引用是通過URL中特殊的'parent'參數(shù)傳入的,因此在索引子文檔的時(shí)候父文檔是不存在的,縱然這個(gè)父文檔不存在,Elasticsearch還是允許指定'parent'參數(shù)的。父子關(guān)系在子文檔的特殊字段中指定(不是在父文檔,這就是為什么在父文檔不存在的情況下,可以索引子文檔),has_child查詢或者h(yuǎn)as_parent查詢,可以自動(dòng)加載id mapping緩存。
\InfoQ:在講述多節(jié)點(diǎn)集群搜索時(shí),你說“默認(rèn)情況下,主分片和分片副本是輪詢搜索的?!痹谶@種情況下,是否存在本地因素?比如,一個(gè)副本存在與接收請(qǐng)求的節(jié)點(diǎn),它將被使用?\
\Roy Russo:是的,如果主分片或者分片副本存在于當(dāng)前節(jié)點(diǎn),它將被使用。但是,有一點(diǎn)非常重要,我們必須意識(shí)到查詢會(huì)在集群中廣播到索引的每一個(gè)分片。那些分片執(zhí)行本地查詢并匯報(bào)匹配文檔。
\InfoQ:書中講述了通過每個(gè)文檔的版本號(hào)實(shí)現(xiàn)并發(fā)控制。Elasticsearch為每個(gè)文檔存儲(chǔ)很多的版本號(hào)還是只存最后一個(gè)版本號(hào)?\
\Roy Russo:這是個(gè)常見話題而且令人困惑。Elasticsearch根本沒有提供版本控制,因?yàn)樗A袅嗽嘉臋n的拷貝。它只持有一個(gè)計(jì)數(shù)器,當(dāng)文檔更新、索引或者刪除時(shí),“_version”會(huì)自增。這是一個(gè)便捷的樂觀鎖,有助于保證在并發(fā)更新中,更新的是同一版本號(hào)的文檔,而不是不同版本的。
\InfoQ:書中講述了兩種節(jié)點(diǎn)的發(fā)現(xiàn)機(jī)制,多播(multicast)和單播(unicast,提供host列表)。兩者都能用于AWS。是否還有其他的發(fā)現(xiàn)機(jī)制,比如基于AWS的負(fù)載均衡組?\
\Roy Russo:在AWS上部署時(shí),我強(qiáng)烈推薦Elasticsearch cloud-aws插件。使用AWS IAM角色分配到EC2實(shí)例上,或者使用AWS Access key配置Elasticsearch配置文件,可以神奇般地讓節(jié)點(diǎn)彼此發(fā)現(xiàn)。如果希望使用IAM角色配置,需要注意的是只能在EC2創(chuàng)建的時(shí)候指定IAM角色,此后不能再次修改。這個(gè)cloud-aws插件,可以無縫地讓同一集群名稱的各個(gè)節(jié)點(diǎn)彼此通信,是AWS環(huán)境中確定推薦和支持的。\
額外需要注意的是,因?yàn)?.x的發(fā)布,這款插件從S3插件中分離出來。那些我們自動(dòng)備份在S3上的插件,現(xiàn)在需要單獨(dú)安裝。
\InfoQ:在Elasticsearch實(shí)現(xiàn)Lucene索引合并時(shí),是只對(duì)主分片操作,然后拷貝全部副本嗎?\
\Lee Hinman:不是這樣的,Elasticsearch中的合并是獨(dú)立運(yùn)行的。因?yàn)镋lasticsearch使用文檔級(jí)別的副本,而不是文件級(jí)別,所以每個(gè)索引的每個(gè)分片的合并方式是不確定的。
\InfoQ:現(xiàn)在AWS提供了Elasticsearch托管服務(wù),對(duì)Elasticsearch的采用會(huì)有什么影響?如何簡(jiǎn)化集群管理?\
\Roy Russo:坦白地講,我希望這對(duì)Elasticsearch的采用沒有傷害。我很喜歡AWS,但是Elasticsearch的發(fā)展需要業(yè)余時(shí)間,也許會(huì)給Elasticsearch用戶數(shù)月之久的糟糕體驗(yàn)。\
使用AWS Elasticsearch服務(wù)部署一個(gè)集群只需要非常方便的幾次點(diǎn)擊,但是需要你為便捷犧牲靈活性和可擴(kuò)展性,直到他們開放配置信息和功能。我已經(jīng)看到和經(jīng)歷的一些顯著問題是,無法調(diào)優(yōu)和自定義Elasticsearch性能和日志,無法安裝插件,無法支持Elasticsearch v1.5.x,以及受阻于CORS。此外,你無法在VPC及相關(guān)軟件中運(yùn)行該服務(wù),我會(huì)規(guī)避直到Amazon在該服務(wù)上解決。誰(shuí)知道呢?也許他們能閱讀我們這本書,然后為Elasticsearch服務(wù)做出成功的改變。
\作者簡(jiǎn)介
\Roy Russo 是預(yù)測(cè)分析公司Predikto的工程副總裁。在加入Predikto之前,Roy是佐治亞州亞特蘭大AltiSource實(shí)驗(yàn)室的首席架構(gòu)師。Roy曾是亞特蘭大營(yíng)銷自動(dòng)化軟件供應(yīng)商LoopFuse(最近被亞特蘭大的SalesFusion收購(gòu))的聯(lián)合創(chuàng)始人和產(chǎn)品管理副總裁。Roy還幫助聯(lián)合創(chuàng)建JBoss Portal,JSR-168兼容的企業(yè)級(jí)Java門戶網(wǎng)站,是Java內(nèi)容倉(cāng)庫(kù),JSR-170中,JBoss的代表。他目前是領(lǐng)先的ElasticSearch集群開源監(jiān)控和管理應(yīng)用,ElasticHQ.org的創(chuàng)始人《Elasticsearch in Action》一書的合作者。
\Radu Gheorghe 供職于Sematext,他為客戶提供搜索咨詢、產(chǎn)品支持,培訓(xùn)各種Elasticsearch和Solr的部署。他熱衷于日志工具,比如rsyslog(是的,這可能是鐘愛之一),他在Sematext也得到了負(fù)責(zé)日志分析服務(wù)Logsene的機(jī)會(huì)。
\Matthew Lee Hinman 是一位充滿激情的軟件開發(fā)者,尋找具有挑戰(zhàn)性的軟件開發(fā)?;钴S于開源社區(qū),是Clojure和Elasticsearch社區(qū)的貢獻(xiàn)者。Lee樂于在解決挑戰(zhàn)性和趣味性問題的團(tuán)隊(duì)中工作。他非常關(guān)心代碼質(zhì)量,開源了他大部分業(yè)余時(shí)間編寫的代碼。
\查看英文原文:“Elasticsearch in Action” – Book Review and Authors Interview
總結(jié)
以上是生活随笔為你收集整理的《Elasticsearch in Action》书评与作者访谈的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Renascence架构原理——遗传规划
- 下一篇: nginx负载均衡的session共享问