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}
{
"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": "http://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相关知识。
相关文章