Elasticsearch提供了單文檔API和多文檔API,其中API調(diào)用分別針對(duì)單個(gè)文檔和多個(gè)文檔。
當(dāng)對(duì)具有特定映射的相應(yīng)索引進(jìn)行請(qǐng)求時(shí),它有助于在索引中添加或更新JSON文檔。例如,以下請(qǐng)求會(huì)將JSON對(duì)象添加到索引學(xué)校和學(xué)校映射下-
PUT schools/_doc/5 { name":"City School", "description":"ICSE", "street":"West End", "city":"Meerut", "state":"UP", "zip":"250002", "location":[28.9926174, 77.692485], "fees":3500, "tags":["fully computerized"], "rating":"4.5" }
在運(yùn)行上面的代碼時(shí),我們得到以下結(jié)果-
{ "_index" : "schools", "_type" : "_doc", "_id" : "5", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 2, "_primary_term" : 1 }
當(dāng)請(qǐng)求將JSON對(duì)象添加到特定索引時(shí),如果該索引不存在,則此API會(huì)自動(dòng)創(chuàng)建該索引以及該特定JSON對(duì)象的基礎(chǔ)映射??梢酝ㄟ^將elasticsearch.yml文件中存在的以下參數(shù)的值更改為false來禁用此功能。
action.auto_create_index:false index.mapper.dynamic:false
您還可以限制索引的自動(dòng)創(chuàng)建,通過更改以下參數(shù)的值,只允許使用具有特定模式的索引名稱-
action.auto_create_index:+acc*,-bank*
注意:此處 + 表示允許,而 – 表示不允許。
Elasticsearch還提供了版本控制工具。我們可以使用版本查詢參數(shù)來指定特定文檔的版本。
PUT schools/_doc/5?version=7&version_type=external { "name":"Central School", "description":"CBSE Affiliation", "street":"Nagan", "city":"paprola", "state":"HP", "zip":"176115", "location":[31.8955385, 76.8380405], "fees":2200, "tags":["Senior Secondary", "beautiful campus"], "rating":"3.3" }
在運(yùn)行上面的代碼時(shí),我們得到以下結(jié)果-
{ "_index" : "schools", "_type" : "_doc", "_id" : "5", "_version" : 7, "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 3, "_primary_term" : 1 }
版本控制是一個(gè)實(shí)時(shí)過程,不受實(shí)時(shí)搜索操作的影響。
有兩種最重要的版本控制類型-
內(nèi)部版本控制是默認(rèn)版本,從1開始,并隨著每次更新(包括刪除)而遞增。
當(dāng)文檔的版本控制存儲(chǔ)在外部系統(tǒng)(如第三方版本控制系統(tǒng))中時(shí),將使用此功能。要啟用此功能,我們需要將version_type設(shè)置為external。在這里,Elasticsearch將存儲(chǔ)外部系統(tǒng)指定的版本號(hào),并且不會(huì)自動(dòng)對(duì)其進(jìn)行遞增。
操作類型用于強(qiáng)制執(zhí)行創(chuàng)建操作。這有助于避免覆蓋現(xiàn)有文檔。
PUT chapter/_doc/1?op_type=create { "Text":"this is chapter one" }
在運(yùn)行上面的代碼時(shí),我們得到以下結(jié)果-
{ "_index" : "chapter", "_type" : "_doc", "_id" : "1", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 0, "_primary_term" : 1 }
如果在索引操作中未指定ID,則Elasticsearch會(huì)自動(dòng)為該文檔生成ID。
POST chapter/_doc/ { "user" : "tpoint", "post_date" : "2018-12-25T14:12:12", "message" : "Elasticsearch Tutorial" }
在運(yùn)行上面的代碼時(shí),我們得到以下結(jié)果-
{ "_index" : "chapter", "_type" : "_doc", "_id" : "PVghWGoB7LiDTeV6LSGu", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 1, "_primary_term" : 1 }
API通過對(duì)特定文檔執(zhí)行g(shù)et請(qǐng)求來幫助提取類型JSON對(duì)象。
pre class="prettyprint notranslate" > GET schools/_doc/5
在運(yùn)行上面的代碼時(shí),我們得到以下結(jié)果-
{ "_index" : "schools", "_type" : "_doc", "_id" : "5", "_version" : 7, "_seq_no" : 3, "_primary_term" : 1, "found" : true, "_source" : { "name" : "Central School", "description" : "CBSE Affiliation", "street" : "Nagan", "city" : "paprola", "state" : "HP", "zip" : "176115", "location" : [ 31.8955385, 76.8380405 ], "fees" : 2200, "tags" : [ "Senior Secondary", "beautiful campus" ], "rating" : "3.3" } }
此操作是實(shí)時(shí)的,不受索引刷新率的影響。
您還可以指定版本,然后Elasticsearch將僅獲取該文檔的版本。
您還可以在請(qǐng)求中指定_all,以便Elasticsearch可以按每種類型搜索該文檔ID,它將返回第一個(gè)匹配的文檔。
您還可以在特定文檔的結(jié)果中指定所需的字段。
GET schools/_doc/5?_source_includes=name,fees
在運(yùn)行上面的代碼時(shí),我們得到以下結(jié)果-
{ "_index" : "schools", "_type" : "_doc", "_id" : "5", "_version" : 7, "_seq_no" : 3, "_primary_term" : 1, "found" : true, "_source" : { "fees" : 2200, "name" : "Central School" } }
您還可以通過在get請(qǐng)求中添加_source部分來獲取結(jié)果中的源部分。
GET schools/_doc/5?_source
在運(yùn)行上面的代碼時(shí),我們得到以下結(jié)果-
{ "_index" : "schools", "_type" : "_doc", "_id" : "5", "_version" : 7, "_seq_no" : 3, "_primary_term" : 1, "found" : true, "_source" : { "name" : "Central School", "description" : "CBSE Affiliation", "street" : "Nagan", "city" : "paprola", "state" : "HP", "zip" : "176115", "location" : [ 31.8955385, 76.8380405 ], "fees" : 2200, "tags" : [ "Senior Secondary", "beautiful campus" ], "rating" : "3.3" } }
您還可以通過將refresh參數(shù)設(shè)置為true來刷新分片,然后再執(zhí)行g(shù)et操作。
您可以通過向Elasticsearch發(fā)送HTTP DELETE請(qǐng)求來刪除特定的索引,映射或文檔。
DELETE schools/_doc/4
在運(yùn)行上面的代碼時(shí),我們得到以下結(jié)果-
{ "found":true, "_index":"schools", "_type":"school", "_id":"4", "_version":2, "_shards":{"total":2, "successful":1, "failed":0} }
可以指定文檔的版本以刪除該特定版本??梢灾付酚蓞?shù)以從特定用戶刪除文檔,并且如果文檔不屬于該特定用戶,則操作將失敗。在此操作中,您可以像GET API一樣指定刷新和超時(shí)選項(xiàng)。
腳本用于執(zhí)行此操作,版本控制用于確保在獲取和重新編制索引期間未發(fā)生任何更新。例如,您可以使用腳本更新學(xué)費(fèi)-
POST schools/_update/4 { "script" : { "source": "ctx._source.name = params.sname", "lang": "painless", "params" : { "sname" : "City Wise School" } } }
在運(yùn)行上面的代碼時(shí),我們得到以下結(jié)果-
{ "_index" : "schools", "_type" : "_doc", "_id" : "4", "_version" : 3, "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 4, "_primary_term" : 2 }
您可以通過向更新的文檔發(fā)送獲取請(qǐng)求來檢查更新。