ElasticSearch之HTTP索引操作和文档操作
文章目錄
- 1. 核心概念及數據格式
- 1.1 索引( Index)
- 1.2 類型( Type)
- 1.3 文檔( Document)
- 1.4 字段( Field)
- 1.5 映射( Mapping)
- 1.6 分片( Shards)
- 1.7 副本( Replicas)
- 1.8 分配( Allocation)
- 1.9 數據格式
- 2. HTTP操作
- 2.1 索引操作
- 2.1.1 創(chuàng)建索引
- 2.1.2 查看所有索引
- 2.1.3 查看單個索引
- 2.1.4 刪除索引
- 2.2 文檔操作
- 2.2.1 創(chuàng)建文檔
- 2.2.2 查看文檔
- 2.2.3 修改文檔
- 2.2.4 修改字段
- 2.2.5 刪除文檔
- 2.2.6 條件刪除文檔
- 2.2.7 查詢文檔中所有數據
1. 核心概念及數據格式
1.1 索引( Index)
一個索引就是一個擁有相似特征的文檔的集合。
比如,你可以有一個客戶數據的索引,另一個產品目錄的索引,還有一個訂單數據的索引。一個索引由一個名字來標識(必須全部是小寫字母),并且當需要對這個索引中的文檔進行索引、搜索、更新和刪除的時候,都要使用到這個名字。在一個集群中,可以定義任意多的索引。
能搜索的數據必須索引,好處是可以提高查詢速度。
1.2 類型( Type)
在一個索引中,可以定義一種或多種類型。一個類型是索引的一個邏輯上的分類/分區(qū)。通常,會為具有一組共同字段的文檔定義一個類型。ES不同的版本,類型發(fā)生了不同的變化。
| 5.x | 支持多種type |
| 6.x | 只能有一種type |
| 7.x | 默認不再支持自定義索引類型(默認類型為:_doc) |
1.3 文檔( Document)
一個文檔是一個可被索引的基礎信息單元,也就是一條數據。
文檔以JSON格式來表示。在一個index/type里面,可以存儲任意多的文檔。
1.4 字段( Field)
相當于是數據表的字段,對文檔數據根據不同屬性進行的分類標識。
1.5 映射( Mapping)
mapping是對處理數據的方式和規(guī)則做一些限制,如:某個字段的數據類型、默認值、分析器、是否被索引等。
1.6 分片( Shards)
一個索引可以存儲超出單個節(jié)點硬件限制的大量數據。
比如,一個具有10億文檔數據的索引占據1TB的磁盤空間,而任一節(jié)點都可能沒有這樣大的磁盤空間。或者單個節(jié)點處理搜索請求,響應太慢。為了解決這個問題,Elasticsearch提供了將索引劃分成多份的能力,每一份就稱之為分片。在創(chuàng)建一個索引時,可以指定想要的分片數量。每個分片本身也是一個功能完善并且獨立的“索引“,這個“索引”可以被放置到集群中的任何節(jié)點上。
分片很重要,主要有兩方面的原因:
- 允許水平分割 / 擴展內容容量。
- 允許在分片之上進行分布式的、并行的操作,進而提高性能/吞吐量。
至于一個分片怎樣分布,它的文檔怎樣聚合和搜索請求,是完全由Elasticsearch管理的,對于作為用戶來說,這些都是透明的,無需過分關心。
一個 Elasticsearch索引是分片的集合。當 Elasticsearch在索引中搜索的時候,會發(fā)送查詢到每一個屬于索引的分片,然后合并每個分片的結果到一個全局的結果集。
1.7 副本( Replicas)
在一個網絡/云的環(huán)境里,失敗隨時都可能發(fā)生,在某個分片/節(jié)點不知怎么的就處于離線狀態(tài),或者由于任何原因消失了,這種情況下,有一個故障轉移機制是非常有用并且是強烈推薦的。為此目的,Elasticsearch允許創(chuàng)建分片的一份或多份拷貝,這些拷貝叫做復制分片(副本)。
復制分片之所以重要,有兩個主要原因:
- 在分片/節(jié)點失敗的情況下,提供了高可用性。因為這個原因,注意到復制分片從不與原/主要(original/primary)分片置于同一節(jié)點上是非常重要的。
- 擴展搜索量/吞吐量,因為搜索可以在所有的副本上并行運行。
每個索引可以被分成多個分片。一個索引也可以被復制0次(意思是沒有復制)或多次。一旦復制了,每個索引就有了主分片(作為復制源的原來的分片)和復制分片(主分片的拷貝)之別。
分片和復制的數量可以在索引創(chuàng)建時指定。在索引創(chuàng)建之后,可以在任何時候動態(tài)地改變復制的數量,但是事后不能改變分片的數量。
默認情況下,Elasticsearch中的每個索引被分片1個主分片和1個復制,這意味著,如果集群中至少有兩個節(jié)點,索引將會有1個主分片和另外1個復制分片(1個完全拷貝),這樣的話每個索引總共就有2個分片,需要根據索引需要確定分片個數。
1.8 分配( Allocation)
將分片分配給某個節(jié)點的過程,包括分配主分片或者副本。如果是副本,還包含從主分片復制數據的過程。這個過程是由master節(jié)點完成的。
1.9 數據格式
Elasticsearch是面向文檔型數據庫,一條數據在ElasticSearch中就是一個文檔,為了方便理解,可以將 Elasticsearch里存儲文檔數據和關系型數據庫MySQL存儲數據的概念進行一個類比。
Elasticsearch里的 Index可以看做一個庫,而Types相當于表, Documents則相當于表的行。這里Types的概念已經被逐漸弱化, Elasticsearch 6.X中,一個 index下已經只能包含一個type,Elasticsearch 7.X 中 , Type的概念已經被刪除了。
2. HTTP操作
2.1 索引操作
對比關系型數據庫,索引就等同于數據庫
2.1.1 創(chuàng)建索引
在Postman 中,向 ES服務器發(fā) PUT請求: http://127.0.0.1:9200/scorpios
{"acknowledged": true, # 響應結果"shards_acknowledged": true, # 分片結果"index": "scorpios" # 索引名稱 }注意:創(chuàng)建索引庫的分片數默認 1 片,在 7.0.0 之前的 Elasticsearch 版本中,默認 5 片
如果重復添加索引,會返回錯誤信息,put操作具有冪等性,每次操作都必須返回同一結果
2.1.2 查看所有索引
在Postman中,向 ES服務器發(fā) GET請求:http://127.0.0.1:9200/_cat/indices?v
這里請求路徑中的_cat表示查看的意思, indices表示索引,所以整體含義就是查看當前ES服務器中的所有索引,就好像MySQL中的show tables的感覺
| health | 當前服務器健康狀態(tài):green(集群完整)、yellow(單點正常、集群不完整)、red(單點不正常) |
| status | 索引打開、關閉狀態(tài) |
| index | 索引名 |
| uuid | 索引統一編號 |
| pri | 主分片數量 |
| rep | 副本數量 |
| docs.count | 可用文檔數量 |
| docs.deleted | 文檔刪除狀態(tài)(邏輯刪除) |
| store.size | 主分片和副分片整體占空間大小 |
| pri.store.size | 主分片占空間大小 |
2.1.3 查看單個索引
在Postman中,向 ES服務器發(fā) GET請求:http://127.0.0.1:9200/scorpios
{"scorpios": { # 索引名"aliases": {}, # 別名"mappings": {}, #映射"settings": { #設置"index": { #設置-索引"creation_date": "1650005523048", # 設置-索引-創(chuàng)建時間"number_of_shards": "1", # 設置-索引-主分片數量"number_of_replicas": "1", # 設置-索引-副分片數量"uuid": "FbPQEU9zRJajekqOLlcaeg", # 設置-索引-唯一標識"version": { # 設置-索引-版本"created": "7080099"},"provided_name": "scorpios" # 設置-索引-名稱}}} }查看索引向ES服務器發(fā)送的請求路徑和創(chuàng)建索引是一致的,但是 HTTP方法不一致。
2.1.4 刪除索引
在Postman中,向 ES 服務器發(fā) DELETE請求:http://127.0.0.1:9200/scorpios
再次訪問索引時,服務器返回響應:索引不存在
2.2 文檔操作
對比關系型數據庫,文檔就等同于行
2.2.1 創(chuàng)建文檔
索引已經創(chuàng)建好了,接下來創(chuàng)建文檔,并添加數據。這里的文檔可以類比為關系型數據庫中的表數據,添加的數據格式為 JSON格式。
在Postman中,向 ES服務器發(fā) POST請求:http://127.0.0.1:9200/scorpios/_doc
此處如果索引沒有創(chuàng)建,直接創(chuàng)建文檔,也是可以的,會默認把索引也創(chuàng)建好
{"_index": "scorpios", # 索引"_type": "_doc", # 類型-文檔"_id": "htwoLIABBD3yd3QiLrm3", # 唯一標識,可以類比為mysql中的主鍵,隨機生成"_version": 1, # 版本"result": "created", # 結果,created表示創(chuàng)建成功"_shards": { # 分片"total": 2, # 分片-總數"successful": 1, # 分片-成功"failed": 0 # 分片-失敗},"_seq_no": 4,"_primary_term": 1 }此處發(fā)送請求的方式必須為POST,不能是 PUT,否則會發(fā)生錯誤。
此處需要注意:如果增加數據時明確數據主鍵,那么請求方式也可以為PUT。
只需要記住put操作具有冪等性。
上面的數據創(chuàng)建后,由于沒有指定數據唯一性標識(ID),默認情況下 ES服務器會隨機生成一個 。如果想要自定義唯一性標識,需要在創(chuàng)建時指定:http://127.0.0.1:9200/scorpios/_doc/1
2.2.2 查看文檔
查看文檔時,需要指明文檔的唯一性標識,類似于MySQL中數據的主鍵查詢
在Postman中,向 ES服務器發(fā) GET請求:http://127.0.0.1:9200/scorpios/_doc/1
2.2.3 修改文檔
和新增文檔一樣,輸入相同的URL 地址請求,如果請求體變化,會將原有的數據內容覆蓋
在Postman中,向 ES服 務器發(fā) POST請求:http://127.0.0.1:9200/scorpios/_doc/1
{"_index": "scorpios","_type": "_doc","_id": "1","_version": 2, # 版本"result": "updated", # 結果 updated表示數據被更新"_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 2,"_primary_term": 1 }2.2.4 修改字段
修改數據時,也可以只修改某一給條數據的局部信息
在Postman中,向 ES服務器發(fā) POST請求:http://127.0.0.1:9200/scorpios/_update/1
然后再根據唯一性標識,查詢文檔數據,文檔數據已經更新
2.2.5 刪除文檔
刪除一個文檔不會立即從磁盤上移除,它只是被標記成已刪除(邏輯刪除)。
在Postman中,向 ES服務器發(fā) DELETE請求:http://127.0.0.1:9200/scorpios/_doc/1
2.2.6 條件刪除文檔
一般刪除數據都是根據文檔的唯一性標識進行刪除,實際操作時,也可以根據條件對多條數據進行刪除,首先分別增加多條數據。
向ES服務器發(fā) POST請求:http://127.0.0.1:9200/scorpios/_delete_by_query
{"took": 141, # 耗時"timed_out": false, # 是否超時"total": 1, # 總數"deleted": 1, # 刪除數量"batches": 1,"version_conflicts": 0,"noops": 0,"retries": {"bulk": 0,"search": 0},"throttled_millis": 0,"requests_per_second": -1.0,"throttled_until_millis": 0,"failures": [] }注意:條件刪除是發(fā)Post請求
2.2.7 查詢文檔中所有數據
在Postman中,向 ES服務器發(fā) GET請求:http://127.0.0.1:9200/scorpios/_search。此方式只能查詢出10條數據
可以在上面請求中加入查詢參數來查詢所有數據。
總結
以上是生活随笔為你收集整理的ElasticSearch之HTTP索引操作和文档操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为笔记本没有网线口_matebook
- 下一篇: 2012年9月ITbrand手机品牌排行