【elasticsearch】文档 CRUD 增删改查 以及 相关 参数
1.概述
转载:https://mp.weixin.qq.com/s/aOZnZpAC4c_dYkVW8DfNPg
在Elasticsearch中,文档(document)是所有可搜索数据的最小单位。它被序列化成JSON存储在Elasticsearch中。每个文档都会有一个唯一ID,这个ID你可以自己指定或者交给Elasticsearch自动生成。
如果延续我们之前不恰当的对比RDMS的话,我认为文档可以类比成关系型数据库中的表。
2.元数据
前面我们提到,每个文档都有一个唯一ID来标识,获取文档时,“_id”字段记录的就是文档的唯一ID,它是元数据之一。当然,文档还有一些其他的元数据,下面我们来一一介绍
_index:文档所属的索引名_type:文档所属的type_id:文档的唯一ID
有了这三个,我们就可以唯一确定一个document了,当然,7.0版本以后我们已经不需要_type了。接下来我们再来看看其他的一些元数据
_source:文档的原始JSON数据_field_names:该字段用于索引文档中值不为null的字段名,主要用于exists请求查找指定字段是否为空_ignore:这个字段用于索引和存储文档中每个由于异常(开启了ignore_malformed)而被忽略的字段的名称_meta:该字段用于存储一些自定义的元数据信息_routing:用来指定数据落在哪个分片上,默认值是Id_version:文档的版本信息_score:相关性打分
3.创建文档
创建文档有以下4种方法:
PUT /<index\>/_doc/<_id>POST /<index\>/_doc/PUT /<index>/_create/<_id>POST /<index>/_create/<_id>
这四种方法的区别是,如果不指定id,则Elasticsearch会自动生成一个id。如果使用_create的方法,则必须保证文档不存在,而使用_doc方法的话,既可以创建新的文档,也可以更新已存在的文档。
在创建文档时,还可以选择一些参数。
请求参数
if_seq_no
:当文档的序列号是指定值时才更新if_primary_term
:当文档的primary term是指定值时才更新op_type
:如果设置为create则指定id的文档必须不存在,否则操作失败。有效值为index或create,默认为indexop_type
:指定预处理的管道idrefresh
:如果设置为true,则立即刷新受影响的分片。如果是wait_for
,则会等到刷新分片后,此次操作才对搜索可见。如果是false
,则不会刷新分片。默认值为falserouting
:指定路由到的主分片timeout
:指定响应时间,默认是30秒master_timeout
:连接主节点的响应时长,默认是30秒version
:显式的指定版本号version_type
:指定版本号类型:internal、 external、external_gte、force
wait_for_active_shards
:处理操作之前,必须保持活跃的分片副本数量,可以设置为all或者任意正整数。默认是1,即只需要主分片活跃。
3.1 响应包体
_shards
:提供分片的信息_shards.total
:创建了文档的总分片数量_shards.successful
:成功创建文档分片的数量_shards.failed
:创建文档失败的分片数量_index
:文档所属索引_type
:文档所属type,目前只支持_doc_id
:文档的id_version
:文档的版本号_seq_no
:文档的序列号_primary_term
:文档的主要术语result
:索引的结果,created或者updated
我们在创建文档时,如果指定的索引不存在,则ES会自动为我们创建索引。这一操作是可以通过设置中的action.auto_create_index
字段来控制的,默认是true。你可以修改这个字段,实现指定某些索引可以自动创建或者所有索引都不能自动创建的目的。
4.更新文档
了解了如何创建文档之后,我们再来看看应该如何更新一个已经存在的文档。其实在创建文档时我们就提到过,使用PUT /<index>/_doc/<id>
的方法就可以更新一个已存在的文档。除此之外,我们还有另一种更新文档的方法:
POST /<index>/_update/<_id>
这两种更新有所不同。_doc
方法是先删除原有的文档,再创建新的
。而_update方法则是增量更新
,它的更新过程是先检索到文档,然后运行指定脚本,最后重新索引。
还有一个区别就是_update
方法支持使用脚本更新,默认的语言是painless
,你可以通过参数lang
来进行设置。在请求参数方面,_update相较于_doc多了以下几个参数:
lang
:指定脚本语言retry_on_conflict
:发生冲突时重试次数,默认是0_source
:设置为false,则不返回任何检索字段_source_excludes
:指定要从检索结果排除的source字段_source_includes
:指定要返回的检索source字段
下面的一个例子是用脚本来更新文档
POST /test/_update/1?pretty{"script" : {"source": "ctx._source.counter += params.count","lang": "painless","params" : {"count" : 4}}
}
4.1 Upsert
POST /test/_update/1?pretty{"script" : {"source": "ctx._source.counter += params.count","lang": "painless","params" : {"count" : 4}}, "upsert" : {"counter" : 1}
}
当指定的文档不存在时,可以使用upsert参数,创建一个新的文档,而当指定的文档存在时,该请求会执行script中的脚本。如果不想使用脚本,而只想新增/更新文档的话,可以使用doc_as_upsert。
POST /test/_update/1?pretty
{"doc" : {"name" : "new_name"},"doc_as_upsert" : true
}
4.2 update by query
这个API是用于批量更新检索出的文档的,具体可以通过一个例子来了解。
POST /twitter/_update_by_query?pretty
{"script": {"source": "ctx._source.likes++","lang": "painless"},"query": {"term": {"user": "kimchy"}}
}
5.获取文档
ES获取文档用的是GET API,请求的格式是:
GET /<index>/_doc/<_id>
它会返回文档的数据和一些元数据,如果你只想要文档的内容而不需要元数据时,可以使用
GET /<index>/_source/<_id>
5.1 请求参数
获取文档的有几个请求参数之前已经提到过,这里不再赘述,它们分别是:
refresh
routing_source_source_excludes_source_includesversionversion_type
而还有一些之前没提到过的参数,我们来具体看一下
preference
:用来 指定执行请求的node或shard,如果设置为_local
,则会优先在本地的分片执行realtime
:如果设置为true,则请求是实时的而不是近实时。默认是truestored_fields
:返回指定的字段中,store为true的字段
5.2.mget
mget是批量获取
的方法之一,请求的格式有两种:
GET /_mgetGET /<index>/_mget
第一种是在请求体中写index。第二种是把index放到url中,不过这种方式可能会触发ES的安全检查。
mget的请求参数和get相同,只是需要在请求体中指定doc的相关检索条件
request
GET /_mget
{"docs": [{"_index": "jackey","_id": "1"},{"_index": "jackey","_id": "2"}]
}
response
1{2 "docs" : [3 {4 "_index" : "jackey",5 "_type" : "_doc",6 "_id" : "1",7 "_version" : 5,8 "_seq_no" : 6,9 "_primary_term" : 1,
10 "found" : true,
11 "_source" : {12 "user" : "ja",
13 "tool" : "ES",
14 "message" : "qwer"
15 }
16 },
17 {18 "_index" : "jackey",
19 "_type" : "_doc",
20 "_id" : "2",
21 "_version" : 1,
22 "_seq_no" : 2,
23 "_primary_term" : 1,
24 "found" : true,
25 "_source" : {26 "user" : "zhe",
27 "post_date" : "2019-11-15T14:12:12",
28 "message" : "learning Elasticsearch"
29 }
30 }
31 ]
32}
6.删除文档
CURD操作只剩下最后一个D了,下面我们就一起来看看ES中如何删除一个文档。
删除指定id使用的请求是
DELETE /<index>/_doc/<_id>
在并发量比较大的情况下,我们在删除时通常会指定版本,以确定删除的文档是我们真正想要删除的文档。
删除请求的参数我们在之前也都介绍过,想要具体了解的同学可以直接查看官方文档。
6.1 delete by query
类似于update,delete也有一个delete by query的API。
POST /<index>/_delete_by_query
它也是要先按照条件来查询匹配的文档,然后删除这些文档。在执行查询之前,Elasticsearch会先为指定索引做一个快照,如果在执行删除过程中,要索引发生改变,则会导致操作冲突,同时返回删除失败
。
如果删除的文档比较多,也可以使这个请求异步执行,只需要设置wait_for_completion=false
即可。
这个API的refresh与delete API的refresh参数有所不同,delete中的refresh参数是设置操作是否立即可见,即只刷新一个分片,而这个API中的refresh参数则是需要刷新受影响的所有分片
。
7.Bulk API
最后,我们再来介绍一种特殊的API,批量操作的API。它支持两种写法,可以将索引名写到url中,也可以写到请求体中。
POST /_bulkPOST /<index>/_bulk
在这个请求中,你可以任意使用之前的CRUD请求的组合。
1curl -X POST "localhost:9200/_bulk?pretty" -H 'Content-Type: application/json' -d'
2{ "index" : { "_index" : "test", "_id" : "1" } }
3{ "field1" : "value1" }
4{ "delete" : { "_index" : "test", "_id" : "2" } }
5{ "create" : { "_index" : "test", "_id" : "3" } }
6{ "field1" : "value3" }
7{ "update" : {"_id" : "1", "_index" : "test"} }
8{ "doc" : {"field2" : "value2"} }
9'
请求体中使用的语法是newline delimited JSON(NDJSON)。具体怎么用呢?其实我们在上面的例子中已经有所展现了,对于index或create这样的请求,如果请求本身是有包体的,那么用换行符来表示下面的内容与子请求分隔,即为包体的开始。
例如上面例子中的index请求,它的包体就是{ "field1" : "value1" }
,所以它会在index请求的下一行出现。
对于批量执行操作来说,单条操作失败并不会影响其他操作,而最终每条操作的结果也都会返回。
上面的例子执行完之后,我们得到的结果应该是
1{2 "took": 30,3 "errors": false,4 "items": [5 {6 "index": {7 "_index": "test",8 "_type": "_doc",9 "_id": "1",
10 "_version": 1,
11 "result": "created",
12 "_shards": {13 "total": 2,
14 "successful": 1,
15 "failed": 0
16 },
17 "status": 201,
18 "_seq_no" : 0,
19 "_primary_term": 1
20 }
21 },
22 {23 "delete": {24 "_index": "test",
25 "_type": "_doc",
26 "_id": "2",
27 "_version": 1,
28 "result": "not_found",
29 "_shards": {30 "total": 2,
31 "successful": 1,
32 "failed": 0
33 },
34 "status": 404,
35 "_seq_no" : 1,
36 "_primary_term" : 2
37 }
38 },
39 {40 "create": {41 "_index": "test",
42 "_type": "_doc",
43 "_id": "3",
44 "_version": 1,
45 "result": "created",
46 "_shards": {47 "total": 2,
48 "successful": 1,
49 "failed": 0
50 },
51 "status": 201,
52 "_seq_no" : 2,
53 "_primary_term" : 3
54 }
55 },
56 {57 "update": {58 "_index": "test",
59 "_type": "_doc",
60 "_id": "1",
61 "_version": 2,
62 "result": "updated",
63 "_shards": {64 "total": 2,
65 "successful": 1,
66 "failed": 0
67 },
68 "status": 200,
69 "_seq_no" : 3,
70 "_primary_term" : 4
71 }
72 }
73 ]
74}
批量操作的执行过程相比多次单个操作而言,在性能上会有一定的提升。但同时也会有一定的风险,所以我们在使用的时候要非常的谨慎。
8.总结
本文我们先介绍了文档的基本概念和文档的元数据。接着又介绍了文档的CRUD操作和Bulk API。相信看完文章你对Elasticsearch的文档也会有一定的了解。那最后就请你启动你的Elasticsearch,然后亲自动手试一试这些操作,看看各种请求的参数究竟有什么作用。相信亲手实验过一遍之后你会对这些API有更深的印象。
【elasticsearch】文档 CRUD 增删改查 以及 相关 参数相关推荐
- 分布式搜索elasticsearch 索引文档的增删改查 入门
分布式搜索elasticsearch 索引文档的增删改查 入门 1.RESTful接口使用方法 为了方便直观我们使用Head插件提供的接口进行演示,实际上内部调用的RESTful接口. RESTful ...
- [MongoDB] MongoDB的基本操作以及文档的增删改查
参考视频 链接:https://pan.baidu.com/s/1tAWPEC8yppyrPupkUFdCWQ 提取码:gdn8 MongoDB的基本操作 基本概念 生活中:仓库.架子.物品 计算机: ...
- java jdom进行xml的增删改差_java使用DOM对XML文档进行增删改查操作实例代码
本文研究的主要是java使用DOM对XML文档进行增删改查操作的相关代码,具体实例如下所示. 源代码: package com.zc.homeWork18; import java.io.File; ...
- es内嵌文档查询_ElasticSearch 文档的增删改查都不会?
本文主要是介绍 ElasticSearch 的文档增删改查和批量操作,同时会介绍一些 REST API 返回状态码的具体含义. 我们先来看下这个表: 这个表包含了 Index.Create.Read. ...
- 学生的新增mySQL文档_MySQL增删改查
连接命令:mysql -h[主机地址] -u[用户名] -p[用户密码] 创建数据库:create database [库名] 显示所有数据库: show databases; 打开数据库:use [ ...
- 1月16日学习内容整理:存储库MongoDB之文档的增删改查操作补充
文档操作 一.查 1.比较运算 # SQL:=,!=,>,<,>=,<= # MongoDB:{key:value}代表什么等于什么,"$ne"," ...
- ElasticSearch~ES文档操作~对文档的增删改查
一.新增文档 一.指定文档ID:手动指定ID POST可以不指定ID,会自动生成ID POST /teacher/_doc/1001 {"name":"李四", ...
- MongoDB快速上手、windows安装、常用命令、文档基本增删改查、mongoDB的索引
MongoDB快速上手 目标 理解MongoDB的业务场景.熟悉MongoDB的简介.特点和体系结构.数据类型等. 能够在Windows和Linux下安装和启动MongoDB.图形化管理界面Compa ...
- mongodb对数组元素及内嵌文档进行增删改查操作(转)
from:https://my.oschina.net/132722/blog/168274 比如我有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下: &l ...
最新文章
- TypeScript 类型兼容
- 客户端升级为select模型
- RHCS配置web高可用集群
- 计算机系统结构教程卷子,计算机系统结构试卷试题.docx
- Problem b(BZOJ-2301/HAOI-2011)
- C语言窗口布局,Android开发入门之学习笔记(四):程序窗口的布局(二)
- akka之分发和路由
- Matlab实用技巧
- lrzsz离线安装方法
- Excel—身份证生日提取
- Ubuntu18.04完全美化及常用软件安装 |QQ|TIM|微信|坚果云|备份
- Python之字体反爬详细操作
- LTE物理层概述(7)-- LTE之Turbo编码及其matlab仿真1
- python 重命名的方法,python 怎么重命名文件
- python3根据RGB像素点生成图片
- mit app中计算器制作程序_“个税APP”,防不胜防啊
- MariaDB GRANT ALL PRIVILEGES Access denied for user
- 希尔排序----附图解(C语言)
- 重磅 联想企业网盘发布全新功能!
- Android国际化-中英文切换
热门文章
- iQOO Neo5搭载66W超快闪充:30分钟回血!
- 格力又有新专利了:“一种铁芯冲片、电机及新能源汽车”
- 工信部:老年人拨打三大运营商客服享受一键呼入等服务
- 罗永浩回应被限制高消费:已跟债权方达成和解
- 泡泡玛特通过港交所聆讯 上半年总收益8.18亿元
- 开到朝鲜的国产十元店,一年如何卖出190亿?
- 饿了么“多等5分钟”后,美团外卖宣布给骑手留出8分钟...
- 特斯拉上海超级工厂已在建设动力系统厂房
- 支付宝老年大学招95后青年讲师:不要大厂经验高学历,只要会跳广场舞会钓鱼?...
- 市民举报邻居去韩国代购归来未隔离,真相很尴尬:表面防疫,实则打假?