原文:Elasticsearch入门教程(四):Elasticsearch文档CURD

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

一: 新增文档POST /{index}/{type}PUT /{index}/{type}/{id}

注意:新增文档时可以显式指定id,id可以是数字也可以是字符串,如果不显示指定id,系统会自动生成一个唯一的id值

PUT /shop/goods/1
{
"name": "Apple/苹果 iPhone X",
"price": 9688.00,
"quantity": 999,
"colors": ["银色", "深空灰色"],
"is_discount": true,
"create_date": "2018-01-31 12:10:30",
"ip_addr": "192.168.10.1",
"location": "39.92733,116.39507",
"merchant": {
"id": 2222,
"shop_name": "水果店"
},
"params": [
{"id": 1, "label":"型号", "value": "iphone x"},
{"id": 2, "label":"品牌", "value": "Apple/苹果"}
]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

指定id和不指定id的区别:

  • 如果使用post不指定id,这时的操作肯定是添加操作,因为id是系统生成的,唯一的(类似于关系型数据库,id是自增主键,属于一种insert操作);
  • 如果使用put指定id,当id在类型中还没有存在时,此时和post的操作效果完全一样(也是属于一种insert操作,只不过id使用指定的id,不由数据库自动生成了);
  • 如果使用put指定id,当id已经在类型中存在了,此时就不是一种添加操作了,而是一种更新操作,也就是说put方式既可以新增文档,又可以更新文档(类似于关系型数据库中的save or update 操作,主键不存在时进行insert,主键存在时update操作)

如何使用put方式只进行新增操作,如果id存在了,直接返回一个错误状态409表示冲突,而不是把文档更新掉?有两种方式一种在路径上使用_create,另一种使用参数的方式,使用op_type=create,两种方式完全一样,只是使用风格不一样

PUT /{index}/{type}/{id}/_create 或 PUT /{index}/{type}/{id}?op_type=create

PUT /shop/goods/1/_create
{
"name": "Apple/苹果 iPhone X",
"price": 9688.00,
"quantity": 999,
"colors": ["银色", "深空灰色"],
"is_discount": true,
"create_date": "2018-01-31 12:10:30",
"ip_addr": "192.168.10.1",
"location": "39.92733,116.39507",
"merchant": {
"id": 2222,
"shop_name": "水果店"
},
"params": [
{"id": 1, "label":"型号", "value": "iphone x"},
{"id": 2, "label":"品牌", "value": "Apple/苹果"}
]
} // 返回结果
{
"error": {
"root_cause": [
{
"type": "version_conflict_engine_exception",
"reason": "[goods][1]: version conflict, document already exists (current version [1])",
"index_uuid": "MFndQ_JVQyiPXg1WBDvgpg",
"shard": "3",
"index": "shop"
}
],
"type": "version_conflict_engine_exception",
"reason": "[goods][1]: version conflict, document already exists (current version [1])",
"index_uuid": "MFndQ_JVQyiPXg1WBDvgpg",
"shard": "3",
"index": "shop"
},
"status": 409
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

二:更新文档

注意:在Elasticsearch中文档是不能直接被修改的,当修改文档时es会将旧文档标记为删除状态然后再讲修改的文档作为一条新的文档添加进来, 这样就是间接的达到更新文档的目的。被标记为删除状态的文档并不会立即消失,你也无法访问他,es会在你继续添加更多数据的时候在后台清理已经删除的文件。所以此种方式更新需要列举出来所有字段,如果只更新一个字段的值,那么该文档的所有字段以及对应的值都要列举出来,因为内部更新方式是先删除文档再添加文档,因为是这种原理,所以也可以用于达到删除字段的目的:更新时列举除了要删除的字段的所有文档,然后进行更新。

变相的局部更新:一般是先查出该文档,然后修改个别字段的值,然后再更新该文档,这样可以达到只更新某个字段。

PUT /shop/goods/1
{
"name": "Apple/苹果 iPhone X",
"price": 8888.00,
"quantity": 999,
"colors": ["银色", "深空灰色", "脑残粉"],
"is_discount": true,
"create_date": "2018-01-31 12:10:30",
"ip_addr": "192.168.10.1",
"location": "39.92733,116.39507",
"merchant": {
"id": 2222,
"shop_name": "水果店"
},
"params": [
{"id": 1, "label":"型号", "value": "iphone x"},
{"id": 2, "label":"品牌", "value": "Apple/苹果"}
]
} // 返回结果中有一个字段版本_version:刚插入文档时值为1,每次更新,删除操作时这个版本号都会加1;result字段:在添加文档时值为"created",当更新文档时值为updated
{
"_index": "shop",
"_type": "goods",
"_id": "1",
"_version": 2,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 1
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

局部更新 POST /{index}/{type}/{id}/_update

当字段存在时替换字段的值,当字段不存在时将字段添加到文档中。此种方式只需列举要修改的字段,不修改的字段就不需要列举出来,将要修改的字段放在doc中

// 修改价格,大降价;修改颜色:隔壁老王绿;增加cpu字段
POST /shop/goods/3/_update
{
"doc": {
"price": 666.00,
"colors": ["老王绿"],
"cpu": "A11111111"
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

脚本更新

脚本更新更加灵活,脚本语言可以在更新API中被用来修改_source中的内容,而它在脚本中被称为ctx._source

使用脚本来增加库存数量:
POST /shop/goods/3/_update
{
"script" : "ctx._source.quantity+=1"
}
  • 1
  • 2
  • 3
  • 4
  • 5
使用脚本在颜色数组中添加新的颜色。在这个例子中,我们把新的颜色声明为一个变量,而不是将他写死在脚本中。这样Elasticsearch就可以重新使用这个脚本进行添加新的颜色,而不用再次重新编写脚本了:
POST /shop/goods/3/_update
{
"script": {
"inline": "ctx._source.colors.add(params.new_color)",
"params": {
"new_color": "脑残粉"
}
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
使用ctx.op来根据内容选择是否删除一个文档:
POST /shop/goods/3/_update
{
"script": {
"inline": "ctx.op = ctx._source.cpu == params.cpu ? 'delete' : 'none'",
"params": {"cpu": "A11111111"}
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
当更新一个文档不存在时会报错,如果更新时当文档不存在时就创建可以使用upsert
upsert参数,指定如果文档不存在就应该先创建它:
POST /website/pageviews/1/_update
{
"script" : "ctx._source.views+=1",
"upsert": {
"views": 1
}
}
// 我们第一次运行这个请求时, upsert 值作为新文档被索引,初始化 views 字段为 1 。 在后续的运行中,由于文档已经存在,script 更新操作将替代 upsert 进行应用,对 views 计数器进行累加。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

查询文档 GET /{index}/{type}/{id}

GET /{index}/{type}/{id}/_source 只获取文档的源数据,不获取文档的元数据

查询文档方式很多,后面博客将单独探讨

判断文档是否存在 HEAD /{index}/{type}/{id}

存在返回200 - OK,不存在返回404 - Not Found

删除文档 DELETE /{index}/{type}/{id}

注意:删除一个文档也不会立即生效,它只是被标记成已删除状态。es将会在你之后添加更多索引的时候才会在后台进行删除内容的清理,删除时即使文档不存在版本号也会加1

查看文档总数量 GET /{index}/{type}/_count


我的微信公众号:

Elasticsearch入门教程(四):Elasticsearch文档CURD的更多相关文章

  1. ElasticSearch学习之——基本的文档CURD

    一.文档的添加 POST http://127.0.0.1:9200/{index}/{type}/{id} { "key":"value", "ke ...

  2. MongoDB入门教程一[文档与集合]

    MongoDB 是面向集合存储的文档型数据库,其涉及到的基本概念与关系型数据库相比有所不同.举个例子,在关系型数据库中,我们记录一个订单的信息,通常是这样设计表结构的: 设计一个订单基本信息表和一个订 ...

  3. ElasticSearch入门 第四篇:使用C#添加和更新文档

    这是ElasticSearch 2.4 版本系列的第四篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  4. Elasticsearch从入门到放弃:文档CRUD要牢记

    在Elasticsearch中,文档(document)是所有可搜索数据的最小单位.它被序列化成JSON存储在Elasticsearch中.每个文档都会有一个唯一ID,这个ID你可以自己指定或者交给E ...

  5. Elasticsearch入门教程(六):Elasticsearch查询(二)

    原文:Elasticsearch入门教程(六):Elasticsearch查询(二) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ...

  6. Elasticsearch入门教程(一):Elasticsearch及插件安装

    原文:Elasticsearch入门教程(一):Elasticsearch及插件安装 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ...

  7. Elasticsearch入门教程(五):Elasticsearch查询(一)

    原文:Elasticsearch入门教程(五):Elasticsearch查询(一) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ...

  8. Elasticsearch入门教程(三):Elasticsearch索引&映射

    原文:Elasticsearch入门教程(三):Elasticsearch索引&映射 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文 ...

  9. Elasticsearch入门教程(二):Elasticsearch核心概念

    原文:Elasticsearch入门教程(二):Elasticsearch核心概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:ht ...

随机推荐

  1. 错误“Object reference not set to an instance of an object”的解决方法

    在进行unity游戏制作的C#代码编写时,会遇到“NullReferenceException: Object reference not set to an instance of an objec ...

  2. Zookeeper基础命令操作

    转载链接:https://blog.csdn.net/dandandeshangni/article/details/80558383 安装参考链接https://blog.csdn.net/qiun ...

  3. C++入门经典-例5.17-右值引用的定义

    1:右值引用的定义: 类型 && i=被引用的对象: 左值与右值的区别在于,右值是临时变量,例如,函数的返回值,并且无法被改变. 当右值引用被初始化后,临时变量消失. 代码如下: // ...

  4. C++入门经典-例5.12-动态内存的销毁

    1:当申请一块堆内存后,系统不会再程序执行时一句情况自动销毁它.若想释放该内存,则需要使用delete关键字.下面的代码中,可以看出堆和栈的不同.代码如下: // 5.12.cpp : 定义控制台应用 ...

  5. hdjs---后盾网requireJS课程

    hdjs---后盾网requireJS课程 一.总结 一句话总结: requireJS是js端模块化开发,主要是实现js的异步加载,和管理模块之间的依赖关系,便于代码的编写和维 1.requireJS ...

  6. Entity Framework Code First使用者的福音 --- EF Power Tool使用记之一

    下次会为大家深入解析这个小工具.  最先看到这个工具是在EF产品组最新的博客文章上,http://blogs.msdn.com/b/adonet/archive/2011/05/18/ef-power ...

  7. 问题:解决上传文件IE浏览器弹出下载框bug?

    控制器方法的返回值必须以String返回,再由js处理转换成json对象   $.ajaxFileUpload({ url: "/project/proj_conver_upload&quo ...

  8. orcal 根据打分时间计算打分情况

    create or replace function F_GET_TEST(in_ny in date,in_project_id in number ) return number is sRetu ...

  9. T83310 【音乐会】二重变革

    T83310 [音乐会]二重变革 题解 你看数据那么大,又是一道数学题 题面描述这么个代码肯定不能傻fufu的直接把代码提交上去 我批评我自己 观察代码当中有一行 也就是说明最后这个数列都将变成同一个 ...

  10. kotlin之数组

    一.使用arrayOf函数定义可以存储任意值的数组 var arr1 = arrayOf(1,2,3,'a') println(arr1[3]) 二.使用arrayOfNulls函数定义数组 var ...