本文將分為3塊講解Es的基礎操作。分別為:索引(index)、對映(mapping)、檔案(document)。
語法:
PUT /索引名稱{
"settings":{
"屬性名":"屬性值"
}
}
settings:就是索引庫的設定,可以定義如分片數、副本數等等。不設定的話就是都走預設值。
範例:
PUT /test-demo
HEAD /索引名稱
GET /索引名稱
GET /索引名稱1,索引名稱2
GET _all
POST /索引名稱/_open
POST /索引名稱/_close
DELETE /索引名稱
索引建立之後,等於有了關係型資料庫中的database。Es7.x取消了索引type型別的設定,不能指定型別,預設為_doc,但是欄位仍然是有的,我們需要設定欄位的約束資訊,叫做欄位對映(mapping)。
欄位的約束包括:
語法:
PUT /索引名/_mapping
{
"properties":{
"欄位名":{
"type":"型別",
"index":true,
"store":true,
"analyzer":"分詞器"
}
}
}
範例:
PUT /test-demo1/_mapping
{
"properties":{
"name":{
"type":"text",
"index":true,
"store":true,
"analyzer":"ik_max_word"
},
"job":{
"type":"text",
"analyzer":"ik_max_word"
},
"logo":{
"type":"keyword",
"index":false
}
,
"amt":{
"type":"double"
}
}
}
GET /索引名稱/_mapping
GET _mapping
#或者
GET _all/_mapping
這裡的修改指的是新增欄位,其他更改不支援。只能刪除索引,重建對映
PUT /索引庫名/_mapping
{
"properties": {
"欄位名": {
"type": "型別",
"index": true,
"store": true,
"analyzer": "分詞器"
}
}
}
語法:
put /索引庫名稱
{
"settings":{
"索引庫屬性名":"索引庫屬性值"
},
"mappings":{
"properties":{
"欄位名":{
"對映屬性名":"對映屬性值"
}
}
}
}
範例:
PUT /test-demo2
{
"settings":{},
"mappings": {
"properties": {
"name":{
"type":"text",
"analyzer": "ik_max_word"
}
}
}
}
檔案,即索引庫中的資料,會根據規則建立索引,將來用於搜尋。可以類比做資料庫中的一行資料。
語法:
#自動生成id
POST /索引名稱/_doc
{
"field":"value"
}
#手動指定id
POST /索引名稱/_doc/1
{
"field":"value"
}
範例:
POST /test-demo1/_doc/1
{
"name":"百度",
"job":"運營",
"amt":"3000.34",
"logo":"http://www.lgstatic.com/ttasdf2",
"createTime":"20220303230000"
}
GET /索引名稱/_doc/{id}
結果如下:
{
"_index" : "test-demo1",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 2,
"found" : true,
"_source" : {
"name" : "百度",
"job" : "運營",
"amt" : "3000.34",
"logo" : "http://www.lgstatic.com/ttasdf2",
"createTime" : "20220303230000"
}
}
後設資料項 | 含義 |
---|---|
_index | document所屬index |
_type | document所屬type,Elasticsearch7.x預設type為_doc |
_id | 代表document的唯一標識,與index和type一起,可以唯一標識和定位一個document |
_version | document的版本號,Elasticsearch利用_version(版本號)的方式來確保應用中相互衝突的變更不會導致資料丟失。需要修改資料時,需要指定想要修改檔案的version號,如果該版本不是當前版本號,請求將會失敗 |
_seq_no | 嚴格遞增的順序號,每個檔案一個,Shard級別嚴格遞增,保證後寫入的Doc seq_no大於先寫入的Doc的seq_no。任何型別的寫操作,包括index、create、update和Delete,都會生成一個_seq_no。 |
_primary_term | 當Primary Shard發生重新分配時,比如重啟,Primary選舉等,_primary_term會遞增1。_primary_term主要是用來恢復資料時處理當多個檔案的_seq_no一樣時的衝突,避免Primary Shard上的寫入被覆蓋 |
found | true/false,是否查詢到檔案 |
_source | 儲存原始檔案 |
POST /test-demo1/_search
{
"query":{
"match_all": {}
}
}
GET /test-demo1/_doc/1?_source=name,job
PUT /test-demo1/_doc/1
{
"name":"百度3",
"job":"運營",
"amt":"3000.34",
"logo":"http://www.lgstatic.com/ttasdf2",
"createTime":"20220303230000"
}
為什麼說是全部更新呢?如果你只傳了name,其他filed不傳。那麼檔案裡就只剩name了。
注意:Elasticsearch執行更新操作的時候,Elasticsearch首先將舊的檔案標記為刪除狀態,然後新增新的檔案,舊的檔案不會立即消失,但是你也無法存取,Elasticsearch會在你繼續新增更多資料的時候在後臺清理已經標記為刪除狀態的檔案。
全部更新,是直接把之前的老資料,標記為刪除狀態,然後,再新增一條更新的(使用PUT或者POST)
POST /索引名稱/_update/{id}
{
"doc":{
"field":"value"
}
}
DELETE /索引名稱/_doc/{id}
POST /索引名稱/_delete_by_query
{
"query":{
"match":{
"欄位名":"搜尋鍵碼"
}
}
}
POST /索引名稱/_delete_by_query
{
"query":{
"match_all":{}
}
}
本來如果不存在會建立,存在會更新。強制建立就是僅建立,不更新。已存在就報錯。
PUT /索引名稱/_doc/{id}?op_type=create
{
"filed":"value"
}