资源描述:
《elasticsearch局部更新》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、就像在Updatingawholedocument中所说的一样,更新document的步骤就是检索——修改——插入整个document。然而使用update,就能局部更新,就像在一个请求里增加一个计数器一样。以前说过document是不可变的——不能被修改,只能被替换,update也必须遵守这个规则。在外部看来是局部更新的,在内部,update依然执行了检索——修改——重新插入这个流程。不同的是这个过程是发生在shard中,因此避免了多次网络请求的开销,通过减少检索和重新插入的时间,降低了来自于其他线程的访问导致的数据冲突的可能性。最简单的update格式就是请求体中接受部分
2、的document作为“doc"的参数。这个参数的值会和已经存在的document合并,已经存在的field将会被重写,新的field将会被添加,例如,增加一个tags字段和一个views字段到blog中:POST/website/blog/1/_update{ "doc":{ "tags":["testing"], "views":0 }}如果成功将会相应如下数据:{ "_index": "website", "_id": "1", "_type": "blog", "_version":3}检索这个document,注意一下_source字段:{
3、 "_index": "website", "_type": "blog", "_id": "1", "_version": 3, "found": true, "_source":{ "title": "Myfirstblogentry", "text": "Startingtogetthehangofthis...", "tags":["testing"], "views": 0 }}标注1和2表示就是局部更新的内容。 使用script进行局部更新。我们会在 Scripting–whenyouneedmore(TODO)更详细的介绍
4、script,但是现在来说我们已经足够了解script在ES中的几个合适的用武之地,已满足某些不被API直接支持的但是用户需要的动作。默认的script语言是MVEL,但是ES也是支持JavaScript,Groovy和Python的。MVEL是简单的,快速的,基于jiava的动态脚本语言,语法类似于JavaScript。你可以在 Elasticsearchscriptingdocs和MVELwebsite了解更过关于MVEL的内容。 script能用作updateAPI,用来修改_source的内容,这被称为一个更新的脚本ctx._source。例如,可以使用script增
5、加这个views的数目:POST/website/blog/1/_update{ "script":"ctx._source.views+=1"}我们也能使用script给tags数组增加一个元素,在这个例子中我们指定新的tag作为参数而不是在scritp中硬编码。这个方式允许ES在以后可以重用这个参数,并且不需要每次从新编译这个script:POST/website/blog/1/_update{ "script":"ctx._source.tags+=new_tag", "params":{ "new_tag":"search" }}最后两个的请求相应如下:{
6、 "_index": "website", "_type": "blog", "_id": "1", "_version": 5, "found": true, "_source":{ "title": "Myfirstblogentry", "text": "Startingtogetthehangofthis...", "tags": ["testing","search"], "views": 1 }}标记1表示search这个元素已经追加到tags的数组中。标记2表示views的数量已经增加了。 通过设置ctx.op为delet
7、e,我们甚至能通过script删除一个document。POST/website/blog/1/_update{ "script":"ctx.op=ctx._source.views==count?'delete':'none'", "params":{ "count":1 }}注:以上执行在curl下失败,在head中成功。 更新一个或许不存在的document如果我们需要在ES中存储一个页面访问量的计数器conter,每次用户访问这个页面,我们都对这个页面增加一个数,但是增加这个coun