首页 / 问答 / [Elasticsearch]Elasticsearch中如何批量更新索引中已有文档的object字段的值呢?

[Elasticsearch]Elasticsearch中如何批量更新索引中已有文档的object字段的值呢?

Elasticsearch 1.69K 次浏览
0

对关系型数据库(如:SQL Server,MySQL,Oracle,PostgreSQL等)熟悉的知道,要批量更新某个数据表的某个字段值,语法大致如下:

UPDATE TABLE_NAME SET ColumnName1='Value1' WHERE ...

但在Elasticsearch这种非关系型数据库中,需要更新某个字段的值则要使用Elasticsearch的_update_by_queryAPI和DSL脚本,如下:

POST my-test-001/_update_by_query
{
  "script": {
    "source": "ctx._source.name='Rector'",
    "lang": "painless"
  },
  "query": {
    "match_all": {}
  }
}

以上是批量更新Elasticsearch索引中指定文档的某个字段的值,这个字段是具体的数据类型,而非object。
但如果要更新的字段类型为object呢?
比如在Elasticsearch中,假如有一个索引(测试用例)的映射关系为:

PUT my-test-001/
{
  "mappings": {
    "properties": {
      "name": {
        "type": "keyword"
      }
    }
  }
}

测试数据如下:

POST my-test-001/_doc
{
  "name":"rector"
}

POST my-test-001/_doc
{
  "name":"jack"
}

根据需求,向my-test-001索引中新增了一个object类型的字段,映射关系如下:

PUT my-test-001/_mapping
{
  "properties": {
    "company": {
      "properties": {
        "company_id": {
          "type": "keyword"
        },
        "company_name": {
          "type": "text"
        }
      }
    }
  }
}

在索引my-test-001中,对于已有文档来说,新增的字段company是没有值的,现需要使用Elasticsearch的DSL语句批量更新(设置)company字段中company_idcompany_name的值,应该如何操作呢?

期望的更新后的结果为:

{
    {
        "name" : "rector",
        "company" : {
            "company_id" : "83194bff-a8bd-4a0e-a177-975c2def8222",
            "company_name" : "BTA"
        }
    },
    {
        "name" : "jack",
        "company" : {
            "company_id" : "83194bff-a8bd-4a0e-a177-975c2def8222",
            "company_name" : "BTA"
        }
    }
}
回复 [×]
提交评论
请输入评论内容

1 个回答

  • 0

    Elasticsearch的_update_by_queryAPI提供了script编写更新脚本功能,并可以设置params参数,批量更新object字段时,可以将要更新的object对象放在params参数中,然后在source脚本中设置ctx._source.company=params.company,DSL查询如下:

    Rector的个人主页

    Rector

    2021-09-29 回答

    我来回答