ElasticSearch 文档的添加、获取、更新、删除_05
文章目錄
- 新建文檔
- 獲取文檔
- 批量獲取
- 文檔更新
- 查詢更新
- 刪除文檔
- 批量操作
新建文檔
首先新建一個索引。
然后向索引中添加一個文檔:
PUT blog/_doc/1 {"title":"6. ElasticSearch 文檔基本操作","date":"2021-12-07","content":"首先新建一個索引。" }1 表示新建文檔的 id。
添加成功后,響應的 json 如下:
{"_index" : "blog","_type" : "_doc","_id" : "1","_version" : 1,"result" : "created","_shards" : {"total" : 2,"successful" : 2,"failed" : 0},"_seq_no" : 0,"_primary_term" : 1 }- _index 表示文檔索引。
- _type 表示文檔的類型。
- _id 表示文檔的 id。
- _version 表示文檔的版本(更新文檔,版本會自動加 1,針對一個文檔的)。
- result 表示執行結果。
- _shards 表示分片信息。
- _seq_no 和 _primary_term 這兩個也是版本控制用的(針對當前 index)。
添加成功后,可以查看添加的文檔:
當然,添加文檔時,也可以不指定 id,此時系統會默認給出一個 id,如果不指定 id,則需要使用 POST 請求,而不能使用 PUT 請求。
獲取文檔
Es 中提供了 GET API 來查看存儲在 es 中的文檔。使用方式如下:
GET blog/_doc/1上面這個命令表示獲取一個 id 為 1 的文檔。
如果獲取不存在的文檔,會返回如下信息:
{"_index" : "blog","_type" : "_doc","_id" : "1","_version" : 1,"_seq_no" : 0,"_primary_term" : 1,"found" : true,"_source" : {"title" : "6. ElasticSearch 文檔基本操作","date" : "2021-12-07","content" : "首先新建一個索引。"} }如果僅僅只是想探測某一個文檔是否存在,可以使用 head 請求:
如果文檔不存在,響應如下:
HEAD blog/_doc/2 HEAD blog/_doc/1如果文檔存在,響應如下:
批量獲取
當然也可以批量獲取文檔。
GET blog/_mget {"ids":["1","2"] }文檔更新
- 普通更新
注意,文檔更新一次,version 就會自增 1。
可以直接更新整個文檔:
PUT blog/_doc/1 {"title":"666" }這種方式,更新的文檔會覆蓋掉原文檔。
- 大多數時候,我們只是想更新文檔字段,這個可以通過腳本來實現。
更新的請求格式:POST {index}/_update/{id}
在腳本中,lang 表示腳本語言,painless 是 es 內置的一種腳本語言。source 表示具體執行的腳本,ctx 是一個上下文對象,通過 ctx 可以訪問到 _source、_title 等。
也可以向文檔中添加字段:
POST blog/_update/1 {"script": {"lang": "painless","source":"ctx._source.tags=[\"java\",\"php\"]"} }GET blog/_doc/1通過腳本語言,也可以修改數組。例如再增加一個 tag:
POST blog/_update/1 {"script":{"lang": "painless","source":"ctx._source.tags.add(\"js\")"} }當然,也可以使用 if else 構造稍微復雜一點的邏輯。
POST blog/_update/1 {"script": {"lang": "painless","source": "if (ctx._source.tags.contains(\"java\")){ctx.op=\"delete\"}else{ctx.op=\"none\"}"} }查詢更新
通過條件查詢找到文檔,然后再去更新。
例如將 title 中包含 666 的文檔的 content 修改為 888。
POST blog/_update_by_query {"script": {"source": "ctx._source.content=\"888\"","lang": "painless"},"query": {"term": {"title":"666"}} }刪除文檔
- 根據 id 刪除
從索引中刪除一個文檔。
刪除一個 id 為 1的文檔。
DELETE blog/_doc/1如果在添加文檔時指定了路由,則刪除文檔時也需要指定路由,否則刪除失敗。
- 查詢刪除
查詢刪除是 POST 請求。
例如刪除 title 中包含 666 的文檔
POST blog/_delete_by_query {"query":{"term":{"title":"666"}} }也可以刪除某一個索引下的所有文檔:
POST blog/_delete_by_query {"query":{"match_all":{}} }批量操作
es 中通過 Bulk API 可以執行批量索引、批量刪除、批量更新等操作。
首先需要將所有的批量操作寫入一個 JSON 文件中,然后通過 POST 請求將該 JSON 文件上傳并執行。
例如新建一個名為 aaa.json 的文件,內容如下:
首先第一行:index 表示要執行一個索引操作(這個表示一個 action,其他的 action 還有 create,delete,update)。_index 定義了索引名稱,這里表示要創建一個名為 user 的索引,_id 表示新建文檔的 id 為 666。
第二行是第一行操作的參數。
第三行的 update 則表示要更新。
第四行是第三行的參數。
注意,結尾要空出一行。
aaa.json 文件創建成功后,在該目錄下,執行請求命令,如下:
curl -XPOST "http://localhost:9200/user/_bulk" -H "content-type:application/json" --data-binary @aaa.json執行完成后,就會創建一個名為 user 的索引,同時向該索引中添加一條記錄,再修改該記錄,最終結果如下:
總結
以上是生活随笔為你收集整理的ElasticSearch 文档的添加、获取、更新、删除_05的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式任务调度平台一站式讲解
- 下一篇: 没有写入hosts文件权限