Elasticsearch:如何修改 nested 字段的值

这篇具有很好参考价值的文章主要介绍了Elasticsearch:如何修改 nested 字段的值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Nested 类型是 object 数据类型的特殊版本,它允许对象数组以一种可以彼此独立查询的方式进行索引。在内部,嵌套对象将数组中的每个对象索引为单独的隐藏文档,这意味着每个嵌套对象都可以使用 nested query 独立于其他对象进行查询。每个 nested 对象都被索引为一个单独的 Lucene 文档。有关更多关于 nested 数据类型的文档,我们可以参考之前的文章 “Elasticsearch: object 及 nested 数据类型”。

在使用 Elasticsearch 时,为了系统的效率,我们并不建议经常修改文档,但是在有些时候,我们还必须对已经索引过的文档进行修改。针对 nested 类型的字段,我该如何进行更新及删除呢?

让我们先使用一个例子来进行展示。

我们首先来创建一个 developer 的索引:

PUT developer
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "skills": {
        "type": "nested",
        "properties": {
          "language": {
            "type": "keyword"
          },
          "level": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

在上面,我们定义 skills 为一个 nested 数据类型。我们使用如下的命令来创建两个文档:

POST developer/_doc/101
{
  "name": "zhang san",
  "skills": [
    {
      "language": "ruby",
      "level": "expert"
    },
    {
      "language": "javascript",
      "level": "beginner"
    }
   ]
}
 
POST developer/_doc/102
{
  "name": "li si",
  "skills": [
    {
      "language": "ruby",
      "level": "beginner"
    }
   ]
}

上面的命令写入了两个文档。

添加技能

针对第二个文档,我们想增加如下的一个技能:

{
   "language": "Python",
    "level" "expert"
}

首先让我们使用 painless 语言创建我们的脚本。 你可以在参考资料中阅读有关它的更多详细信息,但熟悉 Java 的人会发现编码很简单。关于 painless 语音的编程,你可以在文章 “Elastic:开发者上手指南” 中的 “Painless 编程” 章节中找到很多文章进行参考。

我们的脚本将验证 skills 字段是否为空,如果是,我们创建列表实例并稍后添加新项目。如果不是,则添加新 skills。 

      if (ctx._source.skills != null) {
         ctx._source.skills.addAll(params.skills);
      } else {
        ctx._source.skills = new ArrayList();
        ctx._source.skills.addAll(params.skills);
      }

最终添加 skills 的代码是这样的:

POST developer/_update/102
{
  "script": {
    "source": """
      if (ctx._source.skills != null) {
        ctx._source.skills.addAll(params.skills);
      } else {
        ctx._source.skills = new ArrayList();
        ctx._source.skills.addAll(params.skills);
      }
    """,
    "params": {
      "skills": [
          {
            "language": "Python",
            "level": "expert"
          }
       ]
    }
  }
}

我们通过如下的命令来进行验证:

GET developer/_doc/102

我们得到如下的结果:

{
  "_index": "developer",
  "_id": "102",
  "_version": 3,
  "_seq_no": 4,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "name": "li si",
    "skills": [
      {
        "language": "ruby",
        "level": "beginner"
      },
      {
        "level": "expert",
        "language": "Python"
      }
    ]
  }
}

从上面,我们可以看出来新的 skills 已经被添加进去了。

删除 skills

同样,我们可以使用如下的代码来删除一个技能:

POST developer/_update/102
{
  "script": {
    "source": """
      if (ctx._source.skills != null) {
        for (int i; i < params.skills.length; i++) {
          ctx._source.skills.removeIf(a->
            a.language.equals(params.skills[i].language) &&
            a.level.equals(params.skills[i].level));
        }
      }
    """,
    "params": {
      "skills": [
        {
          "language": "Python",
          "level": "expert"
        }
      ]
    }
  }
}

我们再次使用如下的命令来查看 id 为 102 的文档:

GET developer/_doc/102

上面的命令返回的值为:

{
  "_index": "developer",
  "_id": "102",
  "_version": 4,
  "_seq_no": 5,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "name": "li si",
    "skills": [
      {
        "language": "ruby",
        "level": "beginner"
      }
    ]
  }
}

我们可以看出来,在上一步添加的 skill,现在已经被成功地移除了。文章来源地址https://www.toymoban.com/news/detail-623953.html

到了这里,关于Elasticsearch:如何修改 nested 字段的值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch修改索引字段类型

    线上功能报错,一看日志是往es中添加数据报错,错误日志如下: 说是数据中有个字段类型转换错误,一查es脚本工具,果然生产es索引中categoryId这个字段是integer类型,而实际是long类型。 es不能直接修改索引字段类型,需要删除调新建,具体方法如下 我这次遇到问题的es索引

    2023年04月08日
    浏览(27)
  • javaAPI操作Elasticsearch_elasticsearch 修改字段 java api

    } } import com.zyw.elasticsearchdemo.constants.HotelConstants; import org.apache.http.HttpHost; import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.indices.Create

    2024年04月17日
    浏览(24)
  • Elasticsearch 索引管理:使用别名来修改字段类型

    在 Elasticsearch 中,一个常见的问题是如何修改已存在的索引的字段类型。这是一个棘手的问题,因为 Elasticsearch 本身不允许直接修改字段类型。如果删除现有索引,重新建索引的话则会导致数据丢失。有一个方法是使用别名索引,当需要调整索引时可以先新建一个索引,把数

    2024年02月03日
    浏览(32)
  • Elasticsearch解决不能修改索引、字段问题解决方案

    问题1: 由于es索引不能删除,不能修改,在不影响原数据的情况下,并且生产服务不停机的情况下,怎么修改索引,并保留原索引内的数据? 基于kibanna的dev Tools执行参数,淘汰postman,kibanna会有提示 1、原来索引起别名job 2、重建索引,数据迁移,默认是同步执行大数据量太

    2024年02月12日
    浏览(28)
  • 5.elasticsearch映射操作(创建|修改|删除)及字段类型

    1.本文介绍了 elasticsearch 映射的操作方式,包括映射创建,修改,删除; 2.映射定义: 映射是定义文档及其包含的字段如何存储和索引的过程 。 例如,使用映射来定义: ① 哪些字符串字段应该被作为全文检索字段; ② 哪些字段包含 数字,日期,及地理位置; ③ 日期格式

    2023年04月12日
    浏览(46)
  • ElasticSearch数据库修改分片数、副本数及修改mapping字段

            对于已经存在的索引,副本数可以随时修改。 示例演示如下:         ElasticSearch中的数据会被分别存储在不同的分片上,索引库的分片数量是在索引库创建的时候通过settings去设置的,如果不设置,分片数默认是5,分片数一旦确定就不能改变。分片数量的设

    2024年02月02日
    浏览(39)
  • ElasticSearch修改分片数和副本数及增加字段

    一、修改副本数 PUT test/_settings {     \\\"index\\\": {         \\\"number_of_replicas\\\" : 1     } } 二、修改分片数 ElasticSearch中的数据会被分别存储在不同的分片上,索引库的分片数量是在索引库创建的时候通过settings去设置的,如果不设置,分片数默认是5,分片数一旦确定就不能改变。如果

    2024年02月05日
    浏览(35)
  • 小程序如何修改缓存中的某一个字段的值;小程序中如何应用vant组件 如:van-dropdown-item、van-field

    将数据放入指定缓存中。 这里缓存块的名称叫‘mydata’,你可以根据自己的需求,取合适的名字。代码如下 效果:这里是存了个对象当示例。也可以存数组,字符串等。 使用 wx.getStorageSync(‘myData’),即可取出‘myData’中缓存的数据。以下代码打印结果为 hello 先取出数据,

    2024年02月09日
    浏览(47)
  • Elasticsearch 复杂类型 Nested

    复杂类型 建模到底是个什么东东? 建模解决什么问题? 复杂类型的的检索问题 主要解决复杂类型无法搜索的问题 nested属于object类型的一种,是Elasticsearch中用于复杂类型对象数组的索引操作。Elasticsearch没有内部对象的概念,因此,ES在存储复杂类型的时候会把对象的 复杂层次

    2024年02月13日
    浏览(32)
  • ElasticSearch之Nested对象

    本文看下es的nested嵌套对象相关内容。 在关系型数据库中定义了6大数据库范式,即1,2,3,BC,4,5的NF(normal form),分别如下: 数据库范式的目的在于减少更新的复杂度,以及降低磁盘的存储空间。其中对于第二个问题存储设备目前非常廉价而且容量很大,所以不是什么问题

    2024年03月28日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包