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