原文: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. Unity3D_(游戏)卡牌01_启动屏界面

      卡牌2D游戏展示 (游戏代码放到  卡牌04_游戏界面  文章最后面~) 游戏项目已托管到github上(里面有个32bit可执行文件) 传送门 规则 开始游戏每张卡牌初始翻开展示 展示几秒后卡牌 ...

  2. hive 分组排序函数 row_number() over(partition by " " order by " "desc

    语法:row_number() over (partition by 字段a order by 计算项b desc ) rank --这里rank是别名 partition by:类似hive的建表, ...

  3. dnSpy

    https://github.com/0xd4d/dnSpy 下载压缩包之后,解压,发现目录里面有3个exe文件 需要用管理员运行dnSpy.exe,然后打开exe文件,设置好断点,然后start 使 ...

  4. debian安装图形界面,使用mstsc远程登录

    环境:debian 10.2 更新软件列表 apt-get update 安装最基本的gnome图形相关软件 apt install x-window-system-core gnome-core 安 ...

  5. 五一 DAY 6

    五一  DAY 6 TypeName   类型名 VariableName  变量名 Part 1 数据结构 函数库:# include < utility > Pair 定义一个变量,它 ...

  6. DFA算法以及ios中OC实现DFA

    DFA不同于苹果手机的idfa DFA全称为:Deterministic Finite Automaton,即确定有穷自动机.其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标 ...

  7. nodejs 之简单web服务器

    1.service.js var http=require('http');//引入http模块 var fs=require('fs');//fs模块 var path=require('path' ...

  8. linux(centOS7)的基本操作(五) 磁盘、分区、挂载、卸载

    linux的磁盘类型和分区简介 linux的磁盘分为IDE和SCSI,目前以后者居多. 1. IDE磁盘的分区:hd+盘号+分区数字 盘号 |-a:基本盘 |-b:基本从属盘 |-c:辅助主盘 |-d ...

  9. 三十六:数据库之SQLAlchemy外建之一对一关系

    relationship()的uselist参数默认为True,即一对多,如果要一对一,则需让uselist=False 准备工作 from sqlalchemy import create_engi ...

  10. 437路径总和III

    题目: 给定一个二叉树,它的每个结点都存放着一个整数值.找出路径和等于给定数值的路径总数.路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点).来源: ht ...