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

2020-06-01 00:00:00 索引 创建 文档 操作 请求

下面讲的是如何使用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}

{

"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相关知识。

相关文章