Elasticsearch 資料模型

2021-10-10 19:26:42 字數 3858 閱讀 1242

資料模型是抽象描述現實世界的一種工具和方法,是通過抽象實體及實體之間聯絡的形式,用圖形化的形式去描述業務規則的過程,從而表示現實世界中事務以及相互關係的一種對映。

核心概念:

實體:現實世界中存在的可以相互區分的事物或概念稱為實體。

實體可以分為事物實體和概念實體。例如:乙個學生、乙個程式設計師等是事物實體。一門課、乙個班級等稱為概念實體。

實體的屬性:每個實體都有自己的特徵,利用實體的屬性可以描述不同的實體。例如。學生實體的屬性為姓名、性別、年齡等

資料建模大致分為三個階段,概念建模階段,邏輯建模階段和物理建模階段。

概念建模階段

概念建模階段,主要做三件事:

客戶交流

理解需求

形成實體

確定系統的核心需求和範圍邊界,設計實體與實體之間的關係。

在概念建模階段,我們只需要關注實體即可,不用關注任何實現細節。很多人都希望在這個階段把具體表結構,索引,約束,甚至是儲存過程都想好,沒必要!因為這些東西是我們在物理建模階段需要考慮的東西,這個時候考慮還為時尚早。概念模型在整個資料建模時間佔比:10%左右

邏輯建模階段

邏輯建模階段,主要做二件事:

進一步梳理業務需求

確定每個實體的屬性、關係和約束等。

邏輯模型是對概念模型的進一步分解和細化,描述了實體、實體屬性以及實體之間的關係,是概念模型

延伸,一般的邏輯模型有第三正規化,星型模型和雪花模型。模型的主要元素為主題、實體、實體屬性和關係。

雪花模型和星狀模型的主要區別是維度的層級 標準的星狀模型只有一層 而雪花模型可能涉及多層。

邏輯模型的作用主要有兩點。

一是便於技術開發人員和業務人員以及使用者進行溝通 交流,使得整個概念模型更易於理解,進一步明確需求。

二是作為物理模型設計的基礎,由於邏輯模型不依賴於具體的資料庫實現,使用邏輯模型可以生成針對具體 資料庫管理系統的物理模型,保證物理模型充分滿足使用者的需求。

邏輯模型在整個資料建模時間佔比:60—70%左右。

物理建模階段

物理建模階段,主要做一件事:

結合具體的資料庫產品(mysql/oracle/mongo/elasticsearch),在滿足業務讀寫效能等需求的前提下

確定最終的定義。

物理模型是在邏輯模型的基礎上描述模型實體的細節,包括資料庫產品對應的資料型別、長度、索引等因素,為邏輯模型選擇乙個最優的物理儲存環境。

邏輯模型轉化為物理模型的過程也就是實體名轉化為表名,屬性名轉化為物理列名的過程。

在設計物理模型時,還需要考慮資料儲存空間的分配,包括對列屬性必須做出明確的定義

例如:客戶姓名的資料型別是varchar2,長度是20,儲存在oracle資料庫中,並且建立索引用於提高該

欄位的查詢效率。物理模型在整個資料建模時間佔比:20—30%左右

資料模型支撐了系統和資料,系統和資料支撐了業務系統。

乙個好的資料模型:

能讓系統更好的整合、能簡化介面。

能簡化資料冗餘 、減少磁碟空間、提公升傳輸效率。

相容更多的資料,不會因為資料型別的新增而導致實現邏輯更改。

能幫助更多的業務機會,提高業務效率。

能減少業務風險、降低業務成本

舉例: 借助logstash實現mysql到elasticsearch的增量同步,如果資料建模階段沒有設計時間戳或者

自增id,就幾乎無法實現

}}(2)data denormalization(資料的非規範化)

這種方式,通俗點就是通過字段冗餘,以一張大寬表來實現粗粒度的index,這樣可以充分發揮扁平化的優勢。但是這是以犧牲索引效能及靈活度為代價的。使用的前提:冗餘的字段應該是很少改變的,比較適合與一對少量關係的處理。當業務資料庫並非採用非規範化設計時,這時要將資料同步到作為二級索引庫的es中,就需要進行定製化開發,基於特定業務進行應用開發來處理join關聯和實體拼接。

說明:寬表處理在處理一對多、多對多關係時,會有字段冗餘問題,適合「一對少量」且這個「一」更新不頻繁的應用場景

put

/user/_doc/

1put

/blogpost/_doc/2}

get/blogpost/_search},

}]}}

}

(3)nested objects(巢狀文件)

索引效能和查詢效能二者不可兼得,必須進行取捨。巢狀文件將實體關係巢狀組合在單文件內部,這種

方式犧牲建立索引效能(文件內任一屬性變化都需要重新索引該文件)來換取查詢效能,比較適合於一

對少量的關係處理

當使用巢狀文件時,使用通用的查詢方式是無法訪問到的,必須使用合適的查詢方式(nested query、

nested filter、nested facet等),很多場景下,使用巢狀文件的複雜度在於索引階段對關聯關係的組

織拼裝。

put

/drivers

,"vehicle":,

"model":}

}}}}

}}put/drivers/_doc/1,

]}}put

/drivers/_doc/

2?refresh,]

}}get/drivers/_search},

}]}}

}}}}

}

(4)parent/child relationships(父子文件)

父子文件犧牲了一定的查詢效能來換取索引效能,適用於寫多讀少的場景。父子文件相比巢狀文件較靈

活,適用於「一對大量」且這個「一」不是海量的應用場景,該方式比較耗記憶體和cpu,這種方式查詢比嵌

套方式慢5~10倍,且需要使用特定的has_parent和has_child過濾器查詢語法,查詢結果不能同時返回

父子文件(一次join查詢只能返回一種型別的文件)。受限於父子文件必須在同一分片上(可以通過

routing指定父文件id即可)操作子文件時需要指定routing

put my_index}}

}}#插入父文件

put/my_index/_doc/

1?refresh

}put

/my_index/_doc/

2?refresh

#插入子文件

put/my_index/_doc/

3?routing=

1}

post my_index/_search}}

}}

get my_index/_search

}}

Elasticsearch 搜尋資料

elasticsearch 修改資料 elasticsearch 搜尋資料 現在我們已經了解了基本知識,讓我們嘗試使用更真實的資料。我們提供了一些虛構的客戶銀行賬戶資訊,格式如下所示 curl localhost 9200 cat indices?v 響應 health status index u...

二 elasticsearch入門(資料)

程式中大多的實體或物件能夠被序列化為包含鍵值對的json物件,鍵 key 是字段 field 或屬性 property 的名字,值 value 可以是字串 數字 波爾型別 另乙個物件 值陣列或者其他特殊型別,比如表示日期的字串或者表示地理位置的物件。accounts 文件元資料 乙個文件不只有資料。...

elasticSearch修改資料

elasticsearch幾乎能實時提供資料操作和搜尋功能。預設情況下,從開始索引 更新 刪除資料到出現搜尋結果的時間可以認為需要一秒的時間。這是與sql等其他平台的重要區別,其中資料在事務完成後可以立即使用。在上節中我們給索引建立了乙個文件,命令為 put customer doc 1 prett...