elasticsearch 6.x (五) 单一文档 API 介绍和使用 update和delete API

本文介绍了Elasticsearch 6.x版本中单一文档APIs的主要功能,包括删除API、更新API等,并提供了详细的使用示例,帮助读者理解如何管理和更新索引中的文档。

大家好,我是烤鸭:

    今天分享的是官网6.x    单一文档(Single document APIs)APIs。

    本文这是部分翻译,如果想看全部的,还是建议阅读官方api。链接:

     https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.html

1.    删除   (delete) API

删除API允许根据特定的索引从特定的索引中删除类型化的JSON文档。下面的示例从称为twitter的索引,类型是_doc,id是1来删除JSON文档。
    
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 并拒绝该请求。

自动索引创建

如果使用 external versioning variant,如果索引尚未创建,则删除操作将自动创建一个索引(请检查create indexAPI以手动创建索引),并且如果尚未创建特定类型之前(检查put mappingAPI以手动创建类型映射),则自动创建动态类型映射。

分布式

删除操作被hash成特定的碎片id。然后,它被重定向到id组内的主碎片中,并在id组内复制(如果需要的话)到碎片副本。

等待active碎片

在执行删除请求时,可以在开始处理删除请求之前设置wait_for_active_shards 参数,以要求最小数量的碎片副本是active的。请参阅这里的详细信息和使用示例。

超时

当主碎片被要求执行删除操作,当操作被执行后,主碎片可能不可用。一些原因可能是,主要碎片目前正在从内存恢复或进行重新定位。默认情况下,删除操作在主碎片在故障和响应错误之前,将等待1分钟timeout 参数可用于显式指定它等待多长时间。下面是将其设置为5分钟的示例:
DELETE /twitter/_doc/1?timeout=5m

2.    更新   (update) API

更新API允许根据提供的脚本更新文档。从索引获取(与碎片搭配的)文档,运行脚本(带有可选的脚本语言和参数),并返回结果(也允许删除或忽略操作)。它使用版本控制来确保在“获取”和“重新索引”期间没有发生任何更新。
注意,此操作仍然意味着文档的完全重新索引,它只删除一些网络往返行程,降低了获取操作和索引操作之间的版本冲突的可能性。必须启用_source字段来启用此功能。

简单例子:

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 。最好是将你的字段对的部分文档放在脚本本身中。

NOOP更新检查

如果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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值