Elasticsearch是什么?
數(shù)據(jù):文檔和索引
Elasticsearch是一個(gè)分布式文檔存儲(chǔ)夹供。Elasticsearch存儲(chǔ)的是序列化為JSON文檔的復(fù)雜數(shù)據(jù)結(jié)構(gòu),而不是以列行數(shù)據(jù)的形式存儲(chǔ)信息填渠。當(dāng)集群中有多個(gè)Elasticsearch節(jié)點(diǎn)時(shí)氛什,存儲(chǔ)的文檔分布在整個(gè)集群中,可以立即從任何節(jié)點(diǎn)訪(fǎng)問(wèn)枪眉。
當(dāng)存儲(chǔ)文檔時(shí)贸铜,它幾乎是實(shí)時(shí)的——在1秒內(nèi)就可以被索引和完全搜索聂受。Elasticsearch使用了一種名為反向索引的數(shù)據(jù)結(jié)構(gòu),它支持非常快速的全文搜索职车。反向索引列出任何文檔中出現(xiàn)的每個(gè)惟一單詞,并標(biāo)識(shí)每個(gè)單詞出現(xiàn)的所有文檔扛芽。
可以將索引看作是文檔的優(yōu)化集合积瞒,每個(gè)文檔是字段的集合茫孔,這些字段是包含數(shù)據(jù)的鍵值對(duì)。默認(rèn)情況下馍悟,Elasticsearch對(duì)每個(gè)字段中的所有數(shù)據(jù)進(jìn)行索引锣咒,每個(gè)索引字段都有一個(gè)專(zhuān)用的侵状、優(yōu)化的數(shù)據(jù)結(jié)構(gòu)趣兄。例如艇潭,文本字段存儲(chǔ)在倒排索引中承粤,數(shù)字和地理字段存儲(chǔ)在BKD樹(shù)中。使用每個(gè)字段的數(shù)據(jù)結(jié)構(gòu)來(lái)組裝和返回搜索結(jié)果的能力是Elasticsearch如此快速的原因
Elasticsearch還具有無(wú)模式的能力仙粱,這意味著可以對(duì)文檔進(jìn)行索引伐割,而不必顯式地指定如何處理文檔中可能出現(xiàn)的每個(gè)不同字段刃唤。當(dāng)動(dòng)態(tài)映射被啟用時(shí),Elasticsearch會(huì)自動(dòng)檢測(cè)并向索引添加新的字段硬霍。這種默認(rèn)行為使得創(chuàng)建索引和瀏覽數(shù)據(jù)變得很容易——只要開(kāi)始創(chuàng)建索引文檔唯卖,Elasticsearch就會(huì)檢測(cè)布爾值躬柬、浮點(diǎn)值和整數(shù)值、日期和字符串橄碾,并將它們映射到合適的Elasticsearch數(shù)據(jù)類(lèi)型颠锉。
但是琼掠,最終,您比Elasticsearch更了解您的數(shù)據(jù)以及您想如何使用它恶复。您可以定義規(guī)則來(lái)控制動(dòng)態(tài)映射,并顯式地定義映射來(lái)完全控制字段的存儲(chǔ)和索引方式副硅。
定義您自己的映射使您能夠:
區(qū)分全文字符串字段和精確值字符串字段
執(zhí)行特定于語(yǔ)言的文本分析
為部分匹配優(yōu)化字段
使用自定義日期格式
使用geo_point和geo_shape等不能自動(dòng)檢測(cè)的數(shù)據(jù)類(lèi)型
為不同的目的以不同的方式為同一個(gè)字段建立索引通常是很有用的恐疲。例如套么,您可能希望將字符串字段索引為全文搜索的文本字段和用于排序或聚合數(shù)據(jù)的關(guān)鍵字字段∈∽桑或者玷室,您可以選擇使用多個(gè)語(yǔ)言分析器來(lái)處理包含用戶(hù)輸入的字符串字段的內(nèi)容
在索引期間應(yīng)用于全文字段的分析鏈也在搜索時(shí)使用。當(dāng)查詢(xún)?nèi)淖侄螘r(shí)敌蜂,在索引中查找術(shù)語(yǔ)之前津肛,查詢(xún)文本會(huì)進(jìn)行相同的分析。
信息輸出:搜索和分析
雖然您可以使用Elasticsearch作為文檔存儲(chǔ)和檢索文檔及其元數(shù)據(jù)囊陡,但它的真正強(qiáng)大之處在于能夠輕松訪(fǎng)問(wèn)構(gòu)建在Apache Lucene搜索引擎庫(kù)上的全套搜索功能。
Elasticsearch提供了一個(gè)簡(jiǎn)單妥色、一致的REST API嘹害,用于管理集群、索引和搜索數(shù)據(jù)幢踏。出于測(cè)試目的许师,您可以直接從命令行或通過(guò)Kibana中的Developer Console輕松地提交請(qǐng)求。在應(yīng)用程序中咧擂,您可以使用Elasticsearch客戶(hù)端來(lái)選擇語(yǔ)言:Java、JavaScript松申、Go贸桶、. net皇筛、PHP识脆、Perl、Python或Ruby离例。
搜索你的數(shù)據(jù)
Elasticsearch REST api支持結(jié)構(gòu)化查詢(xún)宫蛆、全文查詢(xún)和結(jié)合這兩種查詢(xún)的復(fù)雜查詢(xún)耀盗。結(jié)構(gòu)化查詢(xún)類(lèi)似于您可以在SQL中構(gòu)造的查詢(xún)類(lèi)型卦尊。例如岂却,您可以在雇員索引中搜索性別和年齡字段,并根據(jù)hire_date字段對(duì)匹配項(xiàng)進(jìn)行排序署浩。全文查詢(xún)查找與查詢(xún)字符串匹配的所有文檔筋栋,并根據(jù)相關(guān)度(它們與搜索詞的匹配程度)返回它們。
除了搜索單個(gè)術(shù)語(yǔ)外弊攘,您還可以執(zhí)行短語(yǔ)搜索肴颊、相似度搜索和前綴搜索婿着,并獲得自動(dòng)補(bǔ)全建議。
是否有想要搜索的地理空間數(shù)據(jù)或其他數(shù)字?jǐn)?shù)據(jù)?Elasticsearch在優(yōu)化的數(shù)據(jù)結(jié)構(gòu)中對(duì)非文本數(shù)據(jù)進(jìn)行索引提完,支持高性能的地理和數(shù)字查詢(xún)徒欣。
您可以使用Elasticsearch的全面的json風(fēng)格的查詢(xún)語(yǔ)言(query DSL)訪(fǎng)問(wèn)所有這些搜索功能打肝。您還可以構(gòu)造SQL風(fēng)格的查詢(xún)來(lái)在Elasticsearch內(nèi)部本地搜索和聚合數(shù)據(jù)粗梭,JDBC和ODBC驅(qū)動(dòng)程序允許許多第三方應(yīng)用程序通過(guò)SQL與Elasticsearch交互断医。
分析你的數(shù)據(jù)
Elasticsearch聚合使您能夠構(gòu)建復(fù)雜的數(shù)據(jù)總結(jié),并洞察關(guān)鍵指標(biāo)鉴嗤、模式和趨勢(shì)醉锅。不只是尋找眾所周知的“大海撈針”发绢,聚合使您能夠回答這樣的問(wèn)題:
How many needles are in the haystack?
What is the average length of the needles?
What is the median length of the needles, broken down by manufacturer?
How many needles were added to the haystack in each of the last six months?
您還可以使用聚合來(lái)回答更微妙的問(wèn)題,例如
What are your most popular needle manufacturers?
Are there any unusual or anomalous clumps of needles?
因?yàn)榫酆侠昧擞糜谒阉鞯南嗤瑪?shù)據(jù)結(jié)構(gòu)甚纲,所以它們也非常快朦前。這使您能夠?qū)崟r(shí)分析和可視化數(shù)據(jù)介杆。您的報(bào)告和儀表板會(huì)隨著數(shù)據(jù)的更改而更新鹃操,因此您可以根據(jù)最新的信息采取行動(dòng)。
What’s more, aggregations operate alongside search requests. You can search documents, filter results, and perform analytics at the same time, on the same data, in a single request. And because aggregations are calculated in the context of a particular search, you’re not just displaying a count of all size 70 needles, you’re displaying a count of the size 70 needles that match your users' search criteria—for example, all size 70 non-stick embroidery needles
可伸縮性和彈性: 集群春哨、節(jié)點(diǎn)和分片
Elasticsearch始終可用荆隘,并可根據(jù)您的需求進(jìn)行擴(kuò)展。它通過(guò)自然分配來(lái)做到這一點(diǎn)赴背。您可以將服務(wù)器(節(jié)點(diǎn))添加到集群中以增加容量椰拒,Elasticsearch會(huì)自動(dòng)將您的數(shù)據(jù)和查詢(xún)負(fù)載分布到所有可用的節(jié)點(diǎn)上。Elasticsearch不需要徹底檢查應(yīng)用程序凰荚,它知道如何平衡多節(jié)點(diǎn)集群以提供規(guī)娜脊郏化和高可用性。節(jié)點(diǎn)越多越快樂(lè)
這是如何工作的呢?實(shí)際上便瑟,Elasticsearch索引只是一個(gè)或多個(gè)物理碎片的邏輯分組缆毁,其中每個(gè)碎片實(shí)際上是一個(gè)自包含的索引践啄。通過(guò)將索引中的文檔分布到多個(gè)分片上箫爷,并將這些分片分布到多個(gè)節(jié)點(diǎn)上虎锚,Elasticsearch可以確保冗余非春,既可以防止硬件故障护侮,又可以隨著節(jié)點(diǎn)添加到集群中而增加查詢(xún)?nèi)萘俊kS著集群的增長(zhǎng)(或收縮),Elasticsearch會(huì)自動(dòng)遷移碎片來(lái)重新平衡集群
有兩種類(lèi)型的分片:基本分片和復(fù)制分片。索引中的每個(gè)文檔都屬于一個(gè)主分片栋操。復(fù)制分片是主分片的副本。副本提供數(shù)據(jù)的冗余副本,以防止硬件故障歼跟,并增加服務(wù)讀取請(qǐng)求(如搜索或檢索文檔)的容量骚秦。
索引中主分片的數(shù)量在索引創(chuàng)建時(shí)是固定的,但是復(fù)制分片的數(shù)量可以在不中斷索引或查詢(xún)操作的情況下隨時(shí)改變。
取決于
關(guān)于分片大小和為索引配置的主分片數(shù)量阶剑,有許多性能方面的考慮和權(quán)衡外莲。碎片越多办龄,維護(hù)這些索引的開(kāi)銷(xiāo)就越大英融。碎片的大小越大,當(dāng)Elasticsearch需要重新平衡集群時(shí),移動(dòng)碎片所需的時(shí)間就越長(zhǎng)笼呆。
查詢(xún)大量的小分片可以使每個(gè)分片的處理速度更快铭若,但是查詢(xún)?cè)蕉嘁馕吨_(kāi)銷(xiāo)越大非迹,因此查詢(xún)少量的大分片可能會(huì)更快∥靼總之咆畏,這要看情況。
作為起點(diǎn):
目標(biāo)是將平均碎片大小保持在幾GB到幾十GB之間。對(duì)于基于時(shí)間的數(shù)據(jù)的用例甸饱,通常會(huì)看到20GB到 40GB范圍的分片搞动。
避免大量碎片的問(wèn)題箩溃。一個(gè)節(jié)點(diǎn)可以容納的分片數(shù)量與可用堆空間成正比。作為一般規(guī)則止状,每GB堆空間的碎片數(shù)量應(yīng)該小于20個(gè)伏社。
為您的用例確定最佳配置的最佳方法是通過(guò)使用您自己的數(shù)據(jù)和查詢(xún)進(jìn)行測(cè)試买优。
萬(wàn)一發(fā)生災(zāi)難
出于性能原因梧喷,集群內(nèi)的節(jié)點(diǎn)需要位于同一個(gè)網(wǎng)絡(luò)上。在不同數(shù)據(jù)中心的節(jié)點(diǎn)之間平衡集群中的分片花費(fèi)的時(shí)間太長(zhǎng)了胶果。但是高可用性架構(gòu)要求您避免把所有雞蛋放在一個(gè)籃子里悬垃。當(dāng)一個(gè)位置發(fā)生重大故障時(shí)扇谣,另一個(gè)位置的服務(wù)器需要能夠接管簸淀。無(wú)縫男窟。答案嗎?Cross-cluster復(fù)制(CCR)畏纲。
CCR提供了一種從主集群自動(dòng)同步索引到可作為熱備份的輔助遠(yuǎn)程集群的方法。如果主集群故障,輔助集群可以接管夫晌。您還可以使用CCR創(chuàng)建輔助集群凶掰,以服務(wù)于與用戶(hù)地理位置相近的讀請(qǐng)求前翎。
跨集群復(fù)制是主備復(fù)制毅戈。主集群上的索引是活動(dòng)領(lǐng)導(dǎo)索引,并處理所有寫(xiě)請(qǐng)求。復(fù)制到次要集群的索引是只讀的追隨者奠旺。
護(hù)理和喂養(yǎng)
與任何企業(yè)系統(tǒng)一樣忿晕,您需要工具來(lái)保護(hù)咕幻、管理和監(jiān)視您的Elasticsearch集群。安全狐粱、監(jiān)控和管理特性集成到Elasticsearch中,使您能夠使用Kibana作為管理集群的控制中心豆挽。數(shù)據(jù)匯總和索引生命周期管理等特性可以幫助您隨著時(shí)間的推移智能地管理數(shù)據(jù)