zoukankan      html  css  js  c++  java
  • es之对文档进行更新操作

    5.7.1:更新整个文档

    ES中并不存在所谓的更新操作,而是用新文档替换旧文档;

    在内部,Elasticsearch已经标记旧文档为删除并添加了一个完整的新文档并建立索引。旧版本文档不会立即消失

    ,但你也不能去访问它

    PUT /website/blog/123
    {
     "title": "My first blog entry2",
     "text":  "I am starting to get the hang of this...",
     "date":  "2014/01/02"
    }

     

    5.7.2:局部更新[partial _update]

    上面介绍的是更新整个文档,但是往往会出现这种情况,文档非常大,但是只想更新其中的一个数据,这个时候通过检索,修改,然后重建整文档的索引方法来更新文档就不合适了,所以需要使用局部的更新;

    但是仍然需要注意的是,无论是整个文档更新还是局部的更新,都是先找到旧的,然后标记删除,然后在添加新的文档

    所以这个过程大概是这样:

    1.  从旧文档中检索JSON
    2. 修改它
    3. 删除旧文档
    4. 索引新文档
    POST /website/blog/123/_update
    {
      "doc" : {
         "tags" : [ "testing" ],
         "views": 0
      }
    }

    注意,在局部更新中,要使用POST + _update

    5.7.3:使用脚本进行局部更新[Groovy]

    这时候当API不能满足要求时,Elasticsearch允许你使用脚本实现自己的逻辑。脚本支持非常多的API,例如搜索、排序、聚合和文档更新。

    默认的脚本语言是Groovy,一个快速且功能丰富的脚本语言,语法类似于Javascript。它在一个沙盒(sandbox)中运行,以防止恶意用户毁坏Elasticsearch或攻击服务器

    脚本能够使用update API改变source字段的内容,它在脚本内部以ctx.source表示。

    例如,我们可以使用脚本增加博客的views数量:

    POST /website/blog/123/_update
    {
      "script" : "ctx._source.views+=1"
    }

    5.7.4:更新可能不存的文档

    在局部更新操作中,如果遇到了不存在的文档,会出现失败的操作;

    有时候也需要对不存在的文档进行更新【创建】

    POST /website/blog/1/_update
    {
      "script" : "ctx._source.views+=1"
    }

    报错: "type": "document_missing_exception" 因为当前并不存在这个文档

    使用关键字:upsert 当文档不存在的时候,那么就创建这个文档

    POST /website/blog/1/_update
    {
      "script" : "ctx._source.views+=1",
      "upsert": {
          "views": 2
      }
    }

    在局部更新中,使用upsert脚本:

    当文档不存在的时候,会走upsert语句
    当文档已经存在的时候,会走script语句
  • 相关阅读:
    phpexcel导出带生成图片完美案例
    让Asp.Net WebAPI支持OData查询,排序,过滤。(转)
    Workflow笔记2——状态机工作流(转)
    WebAPI请求(转)
    WebApi参数传递总结(转)
    30分钟搞定后台登录界面(103个后台PSD源文件、素材网站)(转)
    .net 分布式架构之分布式锁实现(转)
    C#分布式事务解决方案-TransactionScope(转)
    Windows 环境下分布式跨域Session共享(转)
    Session分布式共享 = Session + Redis + Nginx(转)
  • 原文地址:https://www.cnblogs.com/niutao/p/10908995.html
Copyright © 2011-2022 走看看