关于ElasticSearch新建文档的姿势
定义如下mapping,并且创建索引,索引包括四个字段
有三个分片 (number_of_shards),每个分片有一个副本分片(number_of_replicas)
PUT books
{"mappings": {"properties": {"book_id": {"type": "keyword"},"name": {"type": "text"},"author": {"type": "keyword"},"intro": {"type": "text"}}},"settings": {"number_of_shards": 3,"number_of_replicas": 1}
}
ElasticSearch提供了两种新建索引的方式,一种是使用 Index API 索引文档,一种是使用 Create API 创建文档。
1、通过 Index API 索引文档
PUT books/_doc/1
{"book_id": 1,"name": "linux入门到放弃","author": "huayuanbb","intro": "test"
}
返回的数据为
{"_index" : "books","_type" : "_doc","_id" : "1","_version" : 1,"result" : "created","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 3,"_primary_term" : 1
}
result 为 created 创建,且version为1,通过Index API新建的文档,如果id已经存在的情况下,多次执行,不会报错,只会将返回结果的result 变为 updated version在原来的基础上 +1.
其实在索引一个文档的时候,如果文档 ID 已经存在,会先删除旧文档,然后再写入新文档的内容,并且增加文档版本号。
2、通过 create API 创建文档
通过create API 创建文档有两种方式 POST 和 PUT
POST方式
POST books/_doc
{"book_id": 1,"name": "linux入门到放弃","author": "huayuanbbsssss","intro": "test"
}
采用POST方式创建的文档,无需指定id,系统会自动生成UUID
PUT方式
PUT books/_create/2
{"book_id": 1,"name": "linux入门到放弃","author": "ss","intro": "test"
}
如上示例,使用 PUT 的方式创建文档需要指定文档的 ID,如果文档 ID 已经存在,则返回 http 状态码为 409 的错误。
总结
序号 | 语句 | 特性描述 |
---|---|---|
1 | PUT books/_doc/1 | 插入时需要指定id,且重复插入相同id的文档,只会将返回的结果中的version自增,且result改为updated,本质上是先删除,再写入,并将版本号+1 |
2 | PUT books/_create/1 | 插入时同样需要指定id,但当插入相同id的文档时,会返回状态码为409的错误 |
3 | POST books/_doc/ | 不需要指定文档 ID, 系统自动生成。 |
上表是新建文档时 3 种写法的总结,如果你有更新文档内容的需求,应该使用第一种方式。如果写入文档时有唯一性校验需求的话,应该使用第二种方式。如果需要系统为你创建文档 ID,应该使用第三种方式。相对于第一种方式来说,第三种方式写入的效率会更高,因为不需要在库里查询文档是否已经存在,并且进行后续的删除工作。
同时更新不仅仅可以通过 PUT books/_doc/1 来实现,ElasticSearch也提供了Update API来完成更新操作。
POST books/_update/2
{"doc": {"name":"时间简史(视频版)","intro": "探索时间和空间核心秘密的引人入胜的视频故事。"}
}#结果
{"_index" : "books","_type" : "_doc","_id" : "2","_version" : 3,"result" : "updated",......
}
二者间的区别是updated是在原数据上进行修改,而PUT操作是之间将原数据删除,再插入一条新纪录,且Update只指定要更新的字段即可。
除了使用指定 ID 的方式来更新数据外,还可以用 update_by_query 的方式:
POST books/_update_by_query
{"query": {"term": {"book_id": {"value": 1}}},"script": {"source": "ctx._source.name='深入Linux内核架构'","lang": "painless"}
}
执行完上述代码后,再执行 GET books/_doc/2 操作
可以发现已经修改成功了 ,脚本中 'ctx._source' 可以拿到匹配的文档的数据,所以 ctx._source.name='深入Linux内核架构' 的意思是将匹配文档的 'name' 字段的数据设置为 '深入Linux内核架构'。
需要注意的是,如果 query 中匹配的文档数量巨大,那么这个接口在 kibana 中执行的时候可能会发生超时的错误,当然你可以在请求中使用 timeout 参数,但是这个不是解决问题的有效方案。我建议你使用异步的方式进行处理,并且控制需要更新的数据量,例如按日期分批来进行更新,即在请求的URL后携带一个参数,wait_for_completion=false,其结果会返回一个task id ,再通过
GET _tasks/task_id 来查询任务的执行状态
POST books/_update_by_query?wait_for_completion=false
{"query": {"term": {"book_id": {"value": 1}}},"script": {"source": "ctx._source.name='深入Linux内核架构111'","lang": "painless"}
}{"task" : "CyKKcsubQBupaq7v4Yc_Rg:1102573"
}
关于ElasticSearch新建文档的姿势相关推荐
- elasticsearch 父子文档使用must not 正确姿势
需求描述: 1.基于elasticsearch 父子文档进行子条件查询父文档 2.需要查询出子文档不存在的父文档 已知文档结构: 1.父文档clue_list 关联很多的子文档,我们用roam子文档做 ...
- Elasticsearch之文档document入门
6.1. 默认自带字段解析 {"_index" : "book","_type" : "_doc","_id& ...
- 分布式搜索elasticsearch 索引文档的增删改查 入门
分布式搜索elasticsearch 索引文档的增删改查 入门 1.RESTful接口使用方法 为了方便直观我们使用Head插件提供的接口进行演示,实际上内部调用的RESTful接口. RESTful ...
- Office2019 Word 新建文档豆沙绿背景色失效零时解决方案
Office2019 Word 新建文档豆沙绿背景色失效零时解决方案 参考文章: (1)Office2019 Word 新建文档豆沙绿背景色失效零时解决方案 (2)https://www.cnblog ...
- elasticsearch 路由文档到分片
路由文档到分片 当你索引一个文档,它被存储在单独一个主分片上.Elasticsearch是如何知道文档属于哪个分片的呢?当你创建一个新文档,它是如何知道是应该存储在分片1还是分片2上的呢? 进程不能是 ...
- 【python自动化办公01】word操作-新建文档
点击上方"AI搞事情"关注我们 Python操作Word(Win32com)https://zhuanlan.zhihu.com/p/67543981 Office VBA 参考h ...
- ElasticSearch创建文档
ElasticSearch创建文档 创建文档有两种途径 直接在XcontentBuilder构建json数据,创建文档. // 描述json 数据/** {id:xxx, title:xxx, con ...
- 【elasticsearch】文档 CRUD 增删改查 以及 相关 参数
1.概述 转载:https://mp.weixin.qq.com/s/aOZnZpAC4c_dYkVW8DfNPg 在Elasticsearch中,文档(document)是所有可搜索数据的最小单位. ...
- WPS的新建文档的体验
不知道别人怎么看WPS的新建文档这个操作的体验,反正我是挺不爽的.主要问题就是如果想新建一个文档,有点慢. 由于WPS将文字.表格.演示/幻灯片(PPT)三种东西都放在一个统一的界面下,导致如果你打开 ...
最新文章
- python 多线程和协程结合_一文讲透 “进程、线程、协程”
- eclipse openmp mpi并行编程例子
- TEA加密算法的C/C++实现
- st04 查看数据库日志
- 《斗罗大陆》引入阿里云云原生数据库 PolarDB 游戏体验更流畅
- vue.js:利用vue.js做一个抽奖小游戏
- Enterprise Blocks
- 一个敏捷教练成长必备的8项技能
- 计算机考试如何添加打印机,如何添加网络打印机?
- oracle怎么定位效率,oracle查询效率,该怎么解决
- windows下,配置apache2.4.39执行typhon生成的cgi程序
- 实用的签到、日程表日历控件(可扩展)
- HTML的简单页面加密代码
- 【读书笔记】《曾国藩的正面与侧面(一)》
- 逆战玩着玩着服务器未响应,逆战进不去一直加载,为什么玩逆战加载很久,逆战内置qt修复,逆战进入游戏加载慢,逆战卡加载:逆战没qt了【为什么我逆战进不去QT官方语音】-南开游戏网...
- vue生命周期和vue请求
- 抓取设了CSS反爬机制的大众点评数据(下)
- 小程序码生成及分享图绘制
- 如何用tkinter给你爱人画一个爱心,这满满的油腻感是怎么回事?
- Python爬虫:百度翻译接口获取翻译结果
热门文章
- 阿里三面必问JVM知识点- 使用堆外内存减少Full GC
- string数组转int数组
- 数学 {映射,函数,复合函数,结合函数,反函数}
- 数字城市与智慧城市的创建,数字化大数据技术的应用
- steam api接口 php,api.php · FsTeam/tanghuayan - Gitee.com
- 如何通过手机号获得对应的省份
- 使用宽带路由器方式共享上网频繁掉线
- 我该怎样度此生?——认真并干净地生活
- [转]计算机科学与技术学习心得
- 一文带你详细了解浏览器安全