Elasticsearch:文檔的CRUD操作API(第三篇)

下面講的是如何使用API來創建、檢索、更新、刪除文檔,暫時不關心如何query他們,暫時先關注文檔如何在es中存儲的並讓他們返回。

主要包括如下內容API:

A、單個文檔操作

Index API、Get API、Delete API、Update API

B、批量多個文檔的操作

Multi Get API、Bulk API、Delete By Query API、Update By Query API、Reindex API

  • 1、Index API索引一個文檔

Elasticsearch中的每個索引都被分成分片,每個分片可以有多個副本。這些副本被稱為複製副本,並且在添加或刪除文檔時必須保持同步數據。Elasticsearch的數據複製模型基於主備份模型。

基本的索引過程:

在創建索引的過程中,當你發送文檔時,Elasticsearch會根據文檔的標識符,選擇文檔應編 入索引的分片。默認情況下,Elasticsearch計算文檔標識符的散列值,以此為基礎將文檔放置於 一個可用的主分片上。下面就是索引的api:

PUT /{index}/{type}/{id}

{

t"field":"value",

……

}

如下所示索引是twitter,類型是tweet,Id是1:

curl -XPUT localhost:9200/twitter/tweet/1 -d

{

"user" : "kimchy",

"post_date" : "2009-11-15T14:12:12",

"message" : "trying out Elasticsearch"

}

就會返回相應的響應報文。

1.2、自動創建索引

如果尚未創建索引,PUT索引操作會自動創建一個索引、類型、自動創建動態類型映射mapping。

禁用自動創建索引:可以通過在所有節點的配置文件中將action.auto_create_index設置為false或通過集群更新設置API來禁用。

禁用自動映射創建:通過將index.mapper.dynamic設置為false per-index作為索引設置,可以禁用自動映射創建。

自動索引創建可以包括一個基於模式的白/黑名單,例如,set action.auto_create_index到+ aaa *, - bbb *,+ ccc *, - *(+意思是允許的,而-意思是不允許的)。

  • 2、Get API檢索文檔

跟索引文檔類似,只是PUT改為GET方式:

curl -XGET localhost:9200/twitter/tweet/0?pretty

返回

{

"_index" : "twitter",

"_type" : "tweet",

"_id" : "0",

"_version" : 1,

"found": true,

"_source" : {

"user" : "kimchy",

"date" : "2009-11-15T14:12:12",

"likes": 0,

"message" : "trying out Elasticsearch"

}

}

2.2檢索文檔一部分,source過濾

關閉_source:

curl -XGET localhost:9200/twitter/tweet/0?_source=false&pretty

_source指定欄位user:

curl -XGET localhost:9200/twitter/tweet/0?_source=user&pretty

2.3路由,可以通過路由控制es索引哪個分片

curl -XGET localhost:9200/twitter/tweet/2?routing=user1&pretty

  • 3、delete API 刪除文檔

跟之前的語法類似,只是使用Delete

curl -XDELETE localhost:9200/twitter/tweet/1?pretty

返回報文,如果找到

{

……

"found" : true,

……

}

如果未找到就是false了

3.2 time out超時

默認情況下,刪除操作將在主分片上等待最多1分鐘,然後出現故障並作出響應並顯示錯誤。 timeout參數可以用來明確指定等待的時間。 以下是將其設置為5分鐘的示例:

curl -XDELETE localhost:9200/twitter/tweet/1?timeout=5m&pretty

  • 4、Delete By Query API 根據查詢條件刪除文檔

刪除符合查詢條件的文檔

curl -XPOST localhost:9200/twitter/_delete_by_query?pretty -H Content-Type: application/json -d

{

"query": {

"match": {

"message": "some message"

}

}

}

4.2 scroll_size 批量滾動size大小

默認情況下,_delete_by_query使用1000的滾動批處理。您可以使用scroll_size URL參數更改批處理大小:

curl -XPOST localhost:9200/twitter/_delete_by_query?scroll_size=5000&pretty -H Content-Type: application/json -d

{

"query": {

"term": {

"user": "kimchy"

}

}

}

  • 5、Update API更新文檔

文檔在es中是不可變的,如果更新已經存在的文檔,我們需要重新索引或者替換掉它。

其實es是檢索-修改-重新索引的流程

5.1腳本更新 scripted update

curl -XPOST localhost:9200/test/type1/1/_update?pretty -H Content-Type: application/json -d

{

"script" : {

"source": "ctx._source.counter += params.count",

"lang": "painless",

"params" : {

"count" : 4

}

}

}

script欄位定義了要對文檔進行的操作,可以是任何腳本。這種腳本的好處是更新文檔的時候可以添加一些額外的邏輯。

5.2簡單欄位更新

更新指定文檔的欄位

curl -XPOST localhost:9200/test/type1/1/_update?pretty -H Content-Type: application/json -d

{

"doc" : {

"name" : "new_name"

}

}

如果在發送請求之前name是new_name,那麼整個更新請求將被忽略。 如果請求被忽略,響應中的結果元素將返回noop。

{

"_shards": {

"total": 0,

"successful": 0,

"failed": 0

},

"_index": "test",

"_type": "type1",

"_id": "1",

"_version": 6,

"result": noop

}

5.3 更新不存在的文檔

可以使用upsert參數定義文檔不存在時候直接創建

curl -XPOST localhost:9200/test/type1/1/_update?pretty -H Content-Type: application/json -d

{

"script" : {

"source": "ctx._source.counter += params.count"

}

"upsert":{"counter":1}

}

  • 6、批量操作Mget

6.1為了節約每個請求都要發起網路開銷,可以合併多個請求來避免它,它的速度將更快

curl -XGET localhost:9200/_mget?pretty -H Content-Type: application/json -d

{

"docs" : [

{

"_index" : "test",

"_type" : "type",

"_id" : "1"

},

{

"_index" : "test",

"_type" : "type",

"_id" : "2"

}

]

}

相應的報文是一個doc數組,他們按照請求的順序排序:

{

"docs" : [

{

"_index" : "test",

"_type" : "type",

"_id" : "1",

"found" : false

},

{

"_index" : "test",

"_type" : "type",

"_id" : "2",

"found" : false

}

]

}

6.2如果你檢索的文檔是在同一個index,甚至同一個type,直接在URL帶上index,type即可

curl -XGET localhost:9200/test/type_mget?pretty -H Content-Type: application/json -d

{

"ids" : [

"1","2"

]

}

  • 7、bulk API 批量操作

就想mget允許在檢索多個文檔的時候進行批量操作。那麼bulk允許我們使用單一請求來實現多個文檔的update、index、delete、create操作。

這個是非常有用的高效索引方式。

curl -XPOST localhost:9200/_bulk?pretty -H Content-Type: application/json -d

{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }

{ "field1" : "value1" }

{ "delete" : { "_index" : "test", "_type" : "type1", "_id" : "2" } }

{ "create" : { "_index" : "test", "_type" : "type1", "_id" : "3" } }

{ "field1" : "value3" }

{ "update" : {"_id" : "1", "_type" : "type1", "_index" : "test"} }

{ "doc" : {"field2" : "value2"} }

響應報文是包含一個items的數組,它羅列了每個結果:

{

"took": 30,

"errors": false,

"items": [

{

"index": {

"_index": "test",

"_type": "type1",

"_id": "1",

"_version": 1,

"result": "created",

"_shards": {

"total": 2,

"successful": 1,

"failed": 0

},

"created": true,

"status": 201

}

},

{

"delete": {

…………

},

………

}

行為 actions 有以下幾種:

index 創建文檔或者替換,

create 當文檔不存在的時候創建它,

update 局部更新文檔

必須要指定index 、type、id

注意bulk請求不是原子操作的,每個請求的操作是分開的,它的成功與否不影響其他請求。

  • 8、重建索引Reindex API

重建索引不會嘗試設置目標索引,它不會複製源索引的設置。你應該在運行_reindex操作之前設置目標索引,包括設置映射,分片數量,副本等。

_reindex最基本的形式只是將文件從一個索引複製到另一個索引。 這會將twitter索引中的文檔複製到new_twitter索引中:

curl -XPOST localhost:9200/_reindex?pretty -H Content-Type: application/json -d

{

"source": {

"index": "twitter"

},

"dest": {

"index": "new_twitter"

}

}

還可以通過限制query的方式進行重建索引

curl -XPOST localhost:9200/_reindex?pretty -H Content-Type: application/json -d

{

"source": {

"index": "twitter",

"type": "tweet",

"query": {

"term": {

"user": "kimchy"

}

}

},

"dest": {

"index": "new_twitter"

}

}

8.2遠程重建

Reindex支持從遠程Elasticsearch集群重建索引:

curl -XPOST localhost:9200/_reindex?pretty -H Content-Type: application/json -d

{

"source": {

"remote": {

"host": "otherhost:9200",

"username": "user",

"password": "pass"

},

"index": "source",

"query": {

"match": {

"test": "data"

}

}

},

"dest": {

"index": "dest"

}

}

8.3 Task API 任務API配合使用

您可以使用任務API獲取所有正在運行的重新索引請求的狀態:

curl -XGET localhost:9200/_tasks?detailed=true&actions=*reindex&pretty

返回相應結果

{

"nodes" : {

"r1A2WoRbTwKZ516z6NEs5A" : {

"name" : "r1A2WoR",

"transport_address" : "127.0.0.1:9300",

"host" : "127.0.0.1",

"ip" : "127.0.0.1:9300",

"attributes" : {

"testattr" : "test",

"portsfile" : "true"

},

"tasks" : {

"r1A2WoRbTwKZ516z6NEs5A:36619" : {

"node" : "r1A2WoRbTwKZ516z6NEs5A",

"id" : 36619,

"type" : "transport",

"action" : "indices:data/write/reindex",

"status" : {

"total" : 6154,

"updated" : 3500,

"created" : 0,

"deleted" : 0,

"batches" : 4,

"version_conflicts" : 0,

"noops" : 0,

"retries": {

"bulk": 0,

"search": 0

},

"throttled_millis": 0

},

"description" : ""

}

}

}

}

}

可以進行取消操作

curl -XPOST localhost:9200/_tasks/task_id:1/_cancel?pretty

謝謝,下一篇將介紹es的查詢query相關知識。


推薦閱讀:

Solr,Lucene 優化有哪些相關經驗可分享?
MongoDB 實現全文檢索的最佳解決方案是什麼?
Elasticsearch:深入集群優化

TAG:Elasticsearch | Solr | 全文检索 |