先展現一個document數據結構數據庫
GET /product/_doc/1 { "_index" : "product", "_type" : "_doc", "_id" : "1", "_version" : 1, "_seq_no" : 0, "_primary_term" : 1, "found" : true, "_source" : { "name" : "gaolujie yagao", "desc" : "gaoxiao meibai", "price" : 30, "producer" : "gaolujie producer", "tags" : [ "meibai", "fangzhu" ] } }
下面咱們就來開始分析了json
一、_index表明一個document存放在哪一個index中
二、對於document,相似的數據都是放在一個索引裏面的,,非相似的數據放在不一樣的索引中。例如,product_index是包含了全部商品的index,sales_index是包含了全部商品的銷售數據的index,inventory_index是包含了全部庫存相關的數據。若是想把全部的這些數據都放在一個索引中,好比建立一個company_index,是不合適的。
三、對於每一個索引通常都是包含了不少相似的document,相似是什麼意思,其實指的就是說,這些document的fields很大一部分是相同的,若是說你放了三個document,可是每一個document的fields都徹底不同,這就不是相似了,就不太適合放到一個index裏面去了。
四、對於語法,要求每一個索引名稱必須是小寫的,不能用下劃線開頭,不能包含逗號。安全
一、_type表明這個document屬於index中的哪一個類別(type)
二、一個索引只能有一個type,在後面的ES高版本中可能會廢棄掉
三、對於type的語法,它能夠是大寫或是小寫,可是同時不能用下劃線開頭,不能包含逗號數據結構
一、_id表明document的惟一標識,與index和type一塊兒,能夠惟一標識和定位一個document
二、咱們能夠手動指定document的id,也能夠不指定,那ES就會自動爲咱們建立一個id分佈式
下面附上中華石衫老師的手工圖,說明一下爲何不一樣類型的數據不用一個索引存放性能
概括一下就是若是把多個不一樣類型的數據放在一個索引中存儲,當用戶查詢某一類的數據的時候好比商品數據,大量的請求過來,發現此時後臺數據分析系統對這個索引下的另外一類數據在作聚合分析好比銷售數據,此時這些shard正在執行很是耗時,耗費資源的大型的聚合分析操做。就會致使document get請求,大量的性能很差,甚至超時。讓用戶感受上來講,網速好慢,影響用戶體驗。網站
一、手動指定document id時,須要看下是否知足前提條件:
通常來講,是從某些其餘的系統中,導入一些數據到es時,會採起這種方式,就是使用系統中已有數據的惟一標識,做爲es中的document id。舉個例子,假如咱們如今在開發一個電商網站,作搜索功能,或者是OA系統,作員工的檢索功能。這個時候數據首先會在網站系統或者IT系統內部的數據庫中,會先有一份,此時確定就會有一個數據庫的primary id(自增加,UUID,或者是業務編號)若是將數據導入到ES中,此時就比較適合採用數據在數據庫中的已有primary key。
二、格式編碼
PUT /{index}/{type}/{id}
在什麼狀況下使用自動的document id。對於日誌的蒐集使用自動的document id是比較適合的。還有就是好比咱們是在作一個系統,這個系統主要的數據存儲就是es一種,也就是說,數據產生出來之後,可能就沒有id,直接就放ES存儲,那麼這個時候,可能就不太適合說手動指定document id的形式了。
格式:spa
POST /{index}/{type}
注:自動生成的id,長度爲20個字符,URL安全,base64編碼,GUID,分佈式系統並行生成時不可能會發生衝突日誌
(1)_source元數據
先用一個例子引出一個document的_source,以及它的結構
GET /product/_doc/1 { "_index" : "product", "_type" : "_doc", "_id" : "1", "_version" : 1, "_seq_no" : 0, "_primary_term" : 1, "found" : true, "_source" : { "name" : "gaolujie yagao", "desc" : "gaoxiao meibai", "price" : 30, "producer" : "gaolujie producer", "tags" : [ "meibai", "fangzhu" ] } }
能夠看出_source元數據就是說,咱們在建立一個document的時候,使用的那個放在request body請求體中的json串。
(2)定製返回結果
指定_source參數返回哪些field便可
GET /product/_doc/1?_source=name,desc,tags { "_index" : "product", "_type" : "_doc", "_id" : "1", "_version" : 1, "_seq_no" : 0, "_primary_term" : 1, "found" : true, "_source" : { "name" : "gaolujie yagao", "desc" : "gaoxiao meibai", "tags" : [ "meibai", "fangzhu" ] } }
一、全量替換的語法和建立文檔是同樣的,若是document id不存在,那麼就是建立;若是document id已經存在,那麼就是全量替換操做,替換document的json串內容
二、document是不可變的,若是要修改document的內容,第一種方式就是全量替換,直接對document從新創建索引,替換裏面全部的內容
三、ES會將老的document標記爲deleted,而後新增咱們給定的一個document,當咱們建立愈來愈多的document的時候,es會在適當的時機在後臺自動刪除標記爲deleted的document
建立文檔和全量替換的語法是同樣的,可是有時咱們想新建文檔,不想替換文檔
格式:
PUT /{index}/{type}/{id}?op_type=create
格式:
DELETE /{index}/{type}/{id}
注意刪除並非物理刪除,只是會將文檔標記爲deleted,當數據愈來愈多的時候,會在後臺自動刪除