摘要:本文從使用角度介紹Elasticsearch的數(shù)據(jù)模型,而不是分析Elasticsearch底層的存儲結(jié)構(gòu),教程的目的是幫助大家快速上手ES,我們要使用ES得先...
本文從使用角度介紹Elasticsearch的數(shù)據(jù)模型,而不是分析Elasticsearch底層的存儲結(jié)構(gòu),教程的目的是幫助大家快速上手ES,我們要使用ES得先知道ES是怎么存儲數(shù)據(jù)的,結(jié)構(gòu)是怎么樣的。
我們都知道MYSQL的數(shù)據(jù)模型由數(shù)據(jù)庫、表、字段、字段類型組成,自然ES也有自己的一套存儲結(jié)構(gòu),下面先介紹ES存儲相關(guān)的概念,然后跟MYSQL做一下對比方便大家理解。
MYSQL 是關(guān)系數(shù)據(jù)庫,Elasticsearch是NOSQL類型的數(shù)據(jù)庫,雖然他們都是數(shù)據(jù)庫,但是他們定位不一樣,也不是同一類型的數(shù)據(jù)庫,拿來做對比,是因為一方面大家對MYSQL比較熟悉,另外從使用角度ES的存儲結(jié)構(gòu)跟MYSQL比較相似。
1. 基本概念
1.1. index(索引)
在Elasticsearch中索引(index)類似mysql的表,代表文檔數(shù)據(jù)的集合,文檔指的是ES中存儲的一條數(shù)據(jù)。
1.2. type(文檔類型)
在新版的Elasticsearch中,已經(jīng)不使用文檔類型了,在Elasticsearch老的版本中文檔類型,代表一類文檔的集合,index(索引)類似mysql的數(shù)據(jù)庫、文檔類型類似Mysql的表。
既然新的版本文檔類型沒什么作用了,那么index(索引)就類似mysql的表的概念,ES沒有數(shù)據(jù)庫的概念了。
提示:在Elasticsearch7.0以后的版本,已經(jīng)廢棄文檔類型了,如果大家不是接手老的項目,可以不必理會文檔類型,可以直接將index(索引)類比Mysql的表。
1.3. Document(文檔)
Elasticsearch是面向文檔的數(shù)據(jù)庫,文檔是最基本的存儲單元,文檔類似mysql表中的一行數(shù)據(jù)。
簡單的說在ES中,文檔指的就是一條JSON數(shù)據(jù)。
Elasticsearch中文檔使用json格式存儲,因此存儲上比Mysql要靈活的多,Elasticsearch支持任意格式的json數(shù)據(jù)。
例如:
一個訂單數(shù)據(jù),我們可以將復(fù)雜的Json結(jié)構(gòu)保存到Elasticsearch中, mysql的就無法這樣存儲數(shù)據(jù)。
{ "id": 12, "status": 1, "total_price": 100, "create_time": "2019-12-12 12:20:22", "user" : { // 嵌套json對象 "id" : 11, "username": "yzmcms", "phone": "18801108888", "address" : "北京市海淀區(qū)" } }
文檔中的任何json字段都可以作為查詢條件。
文檔的json格式?jīng)]有嚴(yán)格限制,可以隨意增加、減少字段,甚至每一個文檔的格式都不一樣也可以。
在同一個索引存中,存儲格式完全不一樣的文檔數(shù)據(jù),舉個例子:
{"id":1, "username":"yzmcms"} {"id":1, "title":"yzmcms內(nèi)容管理系統(tǒng)", "tag":"開源cms"} {"domain":"www.yzmcms.com", "https": true}
雖然文檔的格式?jīng)]有限制,可以隨便存儲任意格式數(shù)據(jù),但是,實際業(yè)務(wù)中不會這么干,通常一個索引只會存儲格式相同的數(shù)據(jù),例如:訂單索引,只會保存訂單數(shù)據(jù),不會保存商品數(shù)據(jù),否則你會被自己搞死,自己都不知道里面存的是什么數(shù)據(jù)。
1.4. Field(文檔字段)
文檔由多個json字段(Field)組成, 這里的字段類似mysql中表的字段。
當(dāng)然Elasticsearch中字段也有類型的,下面是常用的字段類型:
數(shù)值類型(包括: long、integer、short、byte、double、float)
text - 支持全文搜索
keyword - 不支持全文搜索,例如:email、電話這些數(shù)據(jù),作為一個整體進(jìn)行匹配就可以,不需要分詞處理。
date - 日期類型
boolean 后面的章節(jié)會專門介紹字段類型,Elasticsearch支持的字段類型遠(yuǎn)比這里介紹的多。
提示:Elasticsearch支持動態(tài)映射,我們可以不必預(yù)先定義文檔的json結(jié)構(gòu)和對應(yīng)的字段類型,Elasticsearch會自動推斷字段的類型。
1.5. mapping (映射)
Elasticsearch的mapping (映射)類似mysql中的表結(jié)構(gòu)定義,每個索引都有一個映射規(guī)則,我們可以通過定義索引的映射規(guī)則,提前定義好文檔的json結(jié)構(gòu)和字段類型,如果沒有定義索引的映射規(guī)則,Elasticsearch會在寫入數(shù)據(jù)的時候,根據(jù)我們寫入的數(shù)據(jù)字段推測出對應(yīng)的字段類型,相當(dāng)于自動定義索引的映射規(guī)則。
提示:雖然Elasticsearch的自動映射功能很方便,但是實際業(yè)務(wù)中,對于關(guān)鍵的字段類型,通常預(yù)先定義好,避免Elasticsearch自動生成的字段類型不是你想要的類型,例如: ES默認(rèn)將字符串類型數(shù)據(jù)自動定義為text類型,但是關(guān)于手機號,我們希望是keyword類型,這個時候就需要通過mapping預(yù)先定義號對應(yīng)的字段類型了。
2. 類比MYSQL存儲結(jié)構(gòu)
Elasticsearch存儲結(jié)構(gòu) --- MYSQL存儲結(jié)構(gòu) index(索引) ----- 表 文檔 ---- 一行數(shù)據(jù) Field(字段) ---- 表字段 mapping (映射) ---- 表結(jié)構(gòu)定義