今天分享的是官网6.x 单一文档(Single document APIs)APIs。
本文这是部分翻译,如果想看全部的,还是建议阅读官方api。链接:
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.html
DELETE /twitter/_doc/1
结果:
{
"_shards" : {
"total" : 2,
"failed" : 0,
"successful" : 2
},
"_index" : "twitter",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"_primary_term": 1,
"_seq_no": 5,
"result": "deleted"
}
version
,以确保我们试图删除的相关文档实际上已经被删除了,并且同时没有被更改。在文档上执行的每一个写入操作(包括删除操作)都会导致其版本增加。删除文档的版本号在删除后的短时间内仍然可用,以允许对并发操作的控制。删除文档的版本可用的时间由index.gc_deletes参数决定和默认为60秒。
DELETE /twitter/_doc/1?routing=kimchy
以上将删除带有索引为tweet ,id为1的文档,但将基于用户路由。注意,没有正确路由的删除将不会删除成功。_routing
映射设置为required
,并且没有指定路由值时,删除API将引发一个路由RoutingMissingException
并拒绝该请求。
wait_for_active_shards
参数,以要求最小数量的碎片副本是active的。请参阅这里的详细信息和使用示例。
timeout
参数可用于显式指定它等待多长时间。下面是将其设置为5分钟的示例:
DELETE /twitter/_doc/1?timeout=5m
简单例子:
PUT test/_doc/1
{
"counter" : 1,
"tags" : ["red"]
}
运行脚本,自增计数。
POST test/_doc/1/_update
{
"script" : {
"source": "ctx._source.counter += params.count",
"lang": "painless",
"params" : {
"count" : 4
}
}
}
我们可以在标签列表中添加一个标签(注意,如果标签存在,它将仍然添加它,因为它是一个列表):
POST test/_doc/1/_update
{
"script" : {
"source": "ctx._source.tags.add(params.tag)",
"lang": "painless",
"params" : {
"tag" : "blue"
}
}
}
除了_source之外,以下变量可通过ctx
图获得,如:_index、_type、_id、_version、_routing
和_now
(当前时间戳)。
也可以在文档中添加新变量:
POST test/_doc/1/_update
{
"script" : "ctx._source.new_field = 'value_of_new_field'"
}
或者删除变量:
POST test/_doc/1/_update
{
"script" : "ctx._source.remove('new_field')"
}
而且,我们甚至可以改变执行的操作。如果tags字段包含green,删除文档,否则它不做任何操作(noop):
POST test/_doc/1/_update
{
"script" : {
"source": "if (ctx._source.tags.contains(params.tag)) { ctx.op = 'delete' } else { ctx.op = 'none' }",
"lang": "painless",
"params" : {
"tag" : "green"
}
}
}
更新API还支持传递部分文档,该文档将被合并到现有文档中(简单递归合并、对象内部合并、替换核心“键值对”和数组)。要完全替换现有文档,应该使用index API。下面的部分更新是对现有文档添加了新字段:
POST test/_doc/1/_update
{
"doc" : {
"name" : "new_name"
}
}
如果指定了doc
和script
,则忽略doc
。最好是将你的字段对的部分文档放在脚本本身中。
如果doc
被指定,它的值将与现有的_source合并。默认情况下,更新检测会检测到它们不会改变任何东西,并返回“"result": "noop" ,像这样:
POST test/_doc/1/_update
{
"doc" : {
"name" : "new_name"
}
}
如果在发送请求之前name
如果是new_name
,则忽略整个更新请求。如果请求被忽略,响应中的result
返回noop
。
{
"_shards": {
"total": 0,
"successful": 0,
"failed": 0
},
"_index": "test",
"_type": "_doc",
"_id": "1",
"_version": 6,
"result": "noop"
}
可以禁用上面的更新检查:
POST test/_doc/1/_update
{
"doc" : {
"name" : "new_name"
},
"detect_noop": false
}
upsert
元素的内容将作为新文档插入。如果文档确实存在,那么script
将被执行:
POST test/_doc/1/_update
{
"script" : {
"source": "ctx._source.counter += params.count",
"lang": "painless",
"params" : {
"count" : 4
}
},
"upsert" : {
"counter" : 1
}
}
如果不管文档是否存在,脚本都运行的话,即脚本代替upsert
初始化文档,将scripted_upsert设置为true:
POST sessions/session/dh3sgudg8gsrgl/_update
{
"scripted_upsert":true,
"script" : {
"id": "my_web_session_summariser",
"params" : {
"pageViewEvent" : {
"url":"foo.com/bar",
"response":404,
"time":"2014-01-01 12:32"
}
}
},
"upsert" : {}
}
doc
加上upsert
doc
,将doc_as_upsert
设置为true
将使用doc
的内容作为upsert
值:
POST test/_doc/1/_update
{
"doc" : {
"name" : "new_name"
},
"doc_as_upsert" : true
}
更新操作支持下列query-string 参数:
retry_on_conflict
在更新的获取和索引阶段之间,可能另一个进程可能已经更新了同一文档。默认情况下,更新操作将因版本冲突异常而失败。retry_on_conflict
参数控制在最终抛出异常之前重试更新的次数。
routing
路由用于将指引更新请求路由到正确的碎片,如果更新的文档不存在,则为更新插入请求设置路由。不能用于更新已存在文档的路由。
timeout
碎片的超时等待变成可用。
wait_for_active_shards
在进行更新操作之前需要active的碎片副本的数量。详情请见这里。
refresh
控制此请求所做的更改为可见的并且能够搜索到。详情见这里。
_source
控制被更新的source是否可以以及如何在响应中返回。默认情况下,更新的source不返回。有关详细信息,请参见source filtering 。
version
Update API在内部使用依靠es的版本控制支持,以确保文档在更新过程中不会改变。可以使用version
参数指定文档仅在其版本与指定的版本匹配时才被更新。
更新API不支持除内部版本之外的版本控制。
更新API不支持外部(版本类型external
和external_gte)或强制(版本类型force)版本,因为这会导致es版本号与外部系统不同步。外部请使用使用index API 。
更多关于elasticsearch 6.x内容:
1. elasticsearch 6.x 部署 windows入门(一) spingboot连接
2. elasticsearch 6.x linux部署(二) kibana x-pack 安装
3. elasticsearch 6.x (三) linux 集群多节点部署
4. elasticsearch 6.x (四) 单一文档 API 介绍和使用 index和get API