Elasticsearch文檔API
Elasticsearch提供單文檔API和多文檔API,其中API調用分別針對單個文檔和多個文檔。
索引API
當使用特定映射對相應索引發出請求時,它有助於在索引中添加或更新JSON文檔。 例如,以下請求將JSON對象添加到索引學校和學校映射下。
POST http://localhost:9200/schools/school/4
請求正文
{
"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"
}
響應
{
"_index":"schools", "_type":"school", "_id":"4", "_version":1,
"_shards":{"total":2, "successful":1,"failed":0}, "created":true
}
自動索引創建
當請求將JSON對象添加到特定索引時,如果該索引不存在,那麼此API會自動創建該索引以及該特定JSON對象的基礎映射。 可以通過將以下參數的值更改爲false
來禁用此功能,這個值是存在於elasticsearch.yml
文件中,打開elasticsearch.yml
文件設置如下 。
action.auto_create_index:false
index.mapper.dynamic:false
還可以限制自動創建索引,其中通過更改以下參數的值只允許指定模式的索引名稱 -
action.auto_create_index:+acc*,-bank*
(其中+
表示允許, -
表示不允許)
版本控制
Elasticsearch還提供版本控制功能。我們可以使用版本查詢參數指定特定文檔的版本。 例如,
POST http://localhost:9200/schools/school/1?version = 1
請求正文
{
"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"
}
響應內容
{
"_index":"schools", "_type":"school", "_id":"1", "_version":2,
"_shards":{"total":2, "successful":1,"failed":0}, "created":false
}
有兩種最重要的版本控制類型: 內部版本控制是以1
開頭的默認版本,每次更新都會增加,包括刪除。版本號可以在外部設置。要啓用此功能,我們需要將version_type
設置爲external
。
版本控制是一個實時過程,它不受實時搜索操作的影響。
操作類型
操作類型用於強制創建操作,這有助於避免覆蓋現有文檔。
POST http://localhost:9200/tutorials/chapter/1?op_type = create
請求正文
{
"Text":"this is chapter one"
}
響應內容
{
"_index":"tutorials", "_type":"chapter", "_id":"1", "_version":1,
"_shards":{"total":2, "successful":1, "failed":0}, "created":true
}
自動生成ID
當在索引操作中未指定ID
時,Elasticsearch自動爲文檔生成ID
。
父級和子級
可以通過在父URL查詢參數中傳遞父文檔的ID來定義任何文檔的父級。
POST http://localhost:9200/tutorials/article/1?parent = 1
請求正文
{
"Text":"This is article 1 of chapter 1"
}
注意 - 如果在執行此示例時遇到異常,請通過在索引中添加以下內容來重新創建索引。
{ "mappings": { "chapter": {}, "article": { "_parent": { "type": "chapter" } } } }
超時
默認情況下,索引操作將在主分片上最多等待1分鐘,超過後就會失敗並響應錯誤。 可以通過將值傳遞給timeout
參數來顯式更改這個超時值。
POST http://localhost:9200/tutorials/chapter/2?timeout = 3m
請求正文
{
"Text":"This is chapter 2 waiting for primary shard for 3 minutes"
}
獲取API
API通過對特定文檔執行get
請求來幫助提取JSON對象。 例如,
GET http://localhost:9200/schools/school/1
響應
{
"_index":"schools", "_type":"school", "_id":"1", "_version":2,
"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"
}
}
- 這個操作是實時的,不受索引刷新率的影響。
- 還可以指定版本,然後Elasticsearch將僅提取該版本的文檔。
- 還可以在請求中指定
_all
,以便Elasticsearch可以在每種類型中搜索該文檔ID
,並且它將返回第一個匹配的文檔。 - 還可以從該特定文檔的結果中指定所需的字段。
GET http://localhost:9200/schools/school/1?fields = name,fees
響應
……………………..
"fields":{
"name":["Central School"], "fees":[2200]
}
……………………..
還可以通過在get
請求中添加_source
字段來獲取結果中的源部分。
GET http://localhost:9200/schools/school/1/_source
響應
{
"name":"Central School", "description":"CBSE Afiliation", "street":"Nagan",
"city":"paprola", "state":"HP", "zip":"176115", "location":[31.8955385, 76.8380405],
"fees":2200, "tags":["Senior Secondary", "beatiful campus"], "rating":"3.3"
}
還可以在通過將 refresh
參數設置爲true
進行get
操作之前刷新碎片。
刪除API
可以通過向Elasticsearch發送HTTP DELETE
請求來刪除指定的索引,映射或文檔。 例如,
DELETE http://localhost:9200/schools/school/4
響應
{
"found":true, "_index":"schools", "_type":"school", "_id":"4", "_version":2,
"_shards":{"total":2, "successful":1, "failed":0}
}
- 可以指定文檔的版本以刪除指定的版本。
- 可以指定路由參數以刪除指定用戶的文檔,如果文檔不屬於該特定用戶,則操作將失敗。
- 在此操作中,可以像GET API那樣指定刷新(
refresh
)和超時(timeout
)選項。
更新API
腳本用於執行此操作,版本控制用於確保在獲取和重建索引期間沒有發生更新。 例如,使用下面腳本更新學校的費用 -
POST http://localhost:9200/schools_gov/school/1/_update
請求正文
{
"script":{
"inline": "ctx._source.fees+ = inc", "params":{
"inc": 500
}
}
}
響應結果
{
"_index":"schools_gov", "_type":"school", "_id":"1", "_version":2,
"_shards":{"total":2, "successful":1, "failed":0}
}
注意 - 如果獲取腳本異常,建議在
elastcisearch.yml
中添加以下行
script.inline: on
script.indexed: on
可以通過向更新的文檔發送獲取請求來檢查更新。
GET http://localhost:9200/schools_gov/school/1
多獲取API
它具有相同的功能,如GET API
,但此get
請求可以返回多個文檔。使用doc
數組來指定需要提取的所有文檔的索引,類型和ID。
POST http://localhost:9200/_mget
請求正文
{
"docs":[
{
"_index": "schools", "_type": "school", "_id": "1"
},
{
"_index":"schools_gev", "_type":"school", "_id": "2"
}
]
}
響應結果
{
"docs":[
{
"_index":"schools", "_type":"school", "_id":"1",
"_version":1, "found":true, "_source":{
"name":"Central School", "description":"CBSE Afiliation",
"street":"Nagan", "city":"paprola", "state":"HP", "zip":"176115",
"location":[31.8955385,76.8380405], "fees":2000,
"tags":["Senior Secondary", "beatiful campus"], "rating":"3.5"
}
},
{
"_index":"schools_gev", "_type":"school", "_id":"2", "error":{
"root_cause":[{
"type":"index_not_found_exception", "reason":"no such index",
"index":"schools_gev"
}],
"type":"index_not_found_exception", "reason":"no such index",
"index":"schools_gev"
}
}
]
}
批量API
此API用於通過在單個請求中進行多個索引/刪除操作來批量上傳或刪除JSON對象。 需要添加「_bulk
」關鍵字來調用此API。此API的示例已在Elasticsearch填充文章中執行。所有其他功能與GET API相同。