1.RESTful風格程序
REST(英文全稱為:"Representational State Transfer")指的是一組架構約束條件和原則。它是一種軟件架構風格(約束條件和原則的集合,但并不是標準)。
REST通過資源的角度觀察網絡,以URI對網絡資源進行唯一標識,響應端根據請求端的不同需求,通過無狀態通信,對其請求的資源進行表述。滿足REST約束條件和原則的架構或接口,就被稱為是RESTful架構或RESTful接口。Web應用程序最重要的REST原則是:(1)客戶端和服務器之間的交互在請求之間是無狀態的;(2)從客戶端到服務器的每個請求都必須包含理解請求所必需的信息;(3)如果服務器在請求之間的任何時間點重啟,客戶端不會得到通知;(4)無狀態請求可以由任何可用服務器回答,這十分適合云計算之類的環境,客戶端可以緩存數據以改進性能。在服務器端,應用程序狀態和功能可以分為各種資源。資源是一個有趣的概念實體,它向客戶端公開。資源的例子有:應用程序對象、數據庫記錄、算法等等。每個資源都使用URI(Universal Resource Identifier)得到一個唯一的地址。所有資源都共享統一的接口,以便在客戶端和服務器之間傳輸狀態。使用的是標準的HTTP方法,比如GET、PUT、POST和DELETE等。我們可以向Elasticsearch發送數據或者其返回數據均是JSON(英文全稱為:"JavaScript Object Notation")格式。
2.JSON快速入門
什么是JSON:JSON是一種輕量級的文本數據交換格式而非編程語言,其語法只支持字符串,數值,布爾值及null以及在此基礎上的對象和數組。舉個例子:基礎數據類型(支持的基礎數據類型參考下表):name = "oldboy"age = 43數組:teachers = ["oldboy", "蒼老師","加藤鷹","小園梨央"]對象:obs = {"name": "oldboy","age":43,"habby":"linux,象棋,跑步"}推薦閱讀:https://www.w3cschool.cn/json/json-intro.html
數據類型 | 舉例 | 說明 |
---|---|---|
字符串 | “oldboy” | 使用雙引號引用字符串 |
數值 | 2021 | 值得注意的是,如果使用雙引號"2021",則其為字符串而非數字喲~ |
布爾值 | true/false | 只有真(true)和假(false)兩個值。 |
空值 | null | 表示一個空值。 |
1.文檔(Document)
文檔就是用戶存在ElasticSearch的一些數據,它是ElasticSearch中存儲數據的最小單元。文檔類似于MySQL數據庫中表中的一行數據。每個文檔都有唯一的"_id"標識,我們可以自定義"_id"(不推薦),如果不指定ES也會自動生成。一個文檔是一個可被索引的基礎信息單元,也就是一條數據。在一個"index/_doc"里面,我們可以存儲任意多的文檔。文檔是以JSON(Javascript Object Notaion)格式來表示,而JSON是一個到處存在的互聯網數據交互格式。JSON比XML更加輕量級,目前JSON已經成為互聯網事實的數據交互標準了,幾乎是所有主流的編程語言都支持。
2.字段(Filed)
相當于數據庫表的字段,對文檔數據根據不同屬性進行的分類標識。在ES中,Document就是一個Json Object,一個json objec其實是由多個字段組成的,每個字段它由不同的數據類型。推薦閱讀:https://www.elastic.co/guide/en/elasticsearch/reference/7.12/mapping-types.html
3.索引(index)
一個索引就是一個擁有相似特征的文檔(Document)的集合。假設你的公司是做電商的,可以將數據分為客戶,產品,訂單等多個類別,在ES數據庫中就對應多個索引。ES索引、文檔、字段關系小結:一個索引里面存儲了很多的Document 文檔,一個文檔就是一個json object,一個json object是由多個不同的filed字段組成;Elasticsearch索引的精髓:一切設計都是為了提高搜索的性能。換句話說,在ES存儲的數據,萬物皆索引,如果數據沒有索引則無法查詢數據。
4.分片(Shards)----> (先講解上面3個概念)
我們假設平均1個文檔占用2k大小,那么按照utf-8對中文的字符編碼,該文檔能存儲682(2 * 1024 / 3)個漢字。如果我們要存儲30億條數據,則需要使用5722GB(3000000000 * 2k,不足6T)存儲空間,一個索引可以存儲超出單個節點硬件限制的大量數據。比如,一個具有30億文檔數據的索引占據6TB的磁盤空間。如果一個集群有3臺服務器,單個節點的磁盤存儲空間僅有4T磁盤空間,很明顯某一個節點是無法存儲下6TB數據的。或者單個節點處理搜索請求,響應太慢。為了解決這個問題,elasticsearch提供了將索引劃分成多份的能力,每一份都稱之為分片。當你創建一個索引的時候,你可以指定你想要的分片數量。每個分片本身也是一個功能完善并且獨立的"索引",這個"索引"可以被放置到集群中的任何節點上。分片很重要,主要有兩方面的原因:(1)允許你水平分割/擴展你的內容容量,當然你也可以選擇垂直擴容;(2)允許你在各節點上的分片進行分布式,并行的操作,從而顯著提升性能(包括但不限于CPU,內存,磁盤,網卡的使用),最顯著的是吞吐量的提升;至于一個分片怎么分布,它的文檔怎樣聚合和搜索請求,是完全由elasticsearch管理的,對于作為用戶的你來說,這些都是透明的,無需過分關心。溫馨提示:一個Lucene索引我們在Elasticsearch稱作分片。一個ElasticSearch索引是分片的集合。當ElasticSearch在索引中搜索的時候,她發送查詢到每一個屬于索引的分片(Lucene索引),然后合并每個分片的結果到一個全局的結果集。
5.副本(Replicas)
無論是在公司內部的物理機房,還是在云環境中,節點故障隨時都有可能發生,可能導致這些故障的原因包括但不限于服務器掉電,Raid陣列中的磁盤損壞,網卡損壞,同機柜交換機損壞等。在某個分片/節點不知為何就處于離線狀態,或者由于任何原因消失了,這種情況下,有一個故障轉移機制是非常有用并且是強烈推薦的。為此目的,elasticsearch允許你創建分片的一份或多份拷貝,這些拷貝叫做復制分片(我們也習慣稱之為“副本”)。副本之所以重要,主要有以下兩個原因:(1)在分片/節點失敗的情況下,提供了高可用性。因為這個原因,注意到復制分片從不與主分片(primary shard)置于同一個節點上是非常重要的;(2)擴展你的搜索量/吞吐量,因為搜索可以在所有的副本上并行運行;總之,每個索引可以被分配成多個分片。一個索引也可以被復制0次(意思是沒有副本分片,僅有主分片)或多次。一旦復制了,每個索引就有了主分片(作為復制源的原來的分片)和復制分片(主分片的拷貝)之別。分片和復制的數量可以在索引創建的時候指定。在索引創建之后,你可以在任何時候動態地改變復制的數量,但是你事后不能改變分片的數量。默認情況下,elasticsearch中的每個索引被分片1個主分片和1個復制分片,這樣的話一個索引總共就有2個分片,我們需要根據索引需求確定分片個數。
6.分配(Allocation)
所謂的分配就是將分片分配給某個節點的過程,包括主分片或者副本。如果是副本,還包含從主分片復制數據的過程,這個過程由master節點完成的。
7.類型(type)
在elasticsearch 5.x及更早的版本,在一個索引中,我們可以定義一種或多種類型。但在ES 7.x版本中,僅支持"_doc"類型。一個索引是你的索引的一個邏輯上的分類/分區,其語義完全由你來定,通常,會為具有一組共同字段的文檔定義一個類型。
8.映射(Mapping)
mapping是處理數據的方式和規則方面做一些限制,如:某個字段的數據類型,默認值,分析器,是否被索引等等。這些都是映射里面可以設置的,其它就是處理ES里面數據的一些使用規則設置也叫做映射。按著最優規則處理數據對性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能對性能更好。值得注意的是,課程后面有相應的案例喲~
9.DSL概述
Elasticsearch提供豐富且靈活的查詢語言叫做DSL查詢(Query DSL),它允許你構建更加復雜,強大的查詢。DSL(Domain Specific Language特定領域語言)以JSON請求體的形式出現。值得注意的是,下面由相關的案例。