ElasticSearch:在数组上添加元素

ncecgwcz  于 2022-11-22  发布在  ElasticSearch
关注(0)|答案(1)|浏览(348)

我正在尝试批量更新ElasticSearch索引上的文档。我想知道如何实现这个场景。
1.如果不存在primaryKey文档,我必须创建文档。
1.如果主键存在,我必须在文档的数组中添加数据。
比如说--
用于初始写入/如果主键不存在。
已写入文档=

{
  PrimaryKey,
  DataList: [
    {
      DataField1: fieldValue1,
      DataField2: fieldValue2,
    }
  ]
}

如果该文档存在,则该条目将被追加到列表中

{
  PrimaryKey,
  DataList: [
    {
      DataField1: fieldValue1,
      DataField2: fieldValue2,
    },
    {
      DataField1: fieldValue3,
      DataField2: fieldValue4
    }
    ....
  ]
}

在批更新中,两种类型的primaryKeys都可能存在,一种类型的primaryKeys具有已经存在于索引中的文档,另一种类型的primaryKeys具有从未添加到索引中的文档。

bejyjqdl

bejyjqdl1#

我认为这个例子可以作为批量的基础。我所做的是考虑_id和PrimaryKey是相同的,因为知道docmentos是否存在的方法是通过_id,如果它不存在,则创建一个新的文档。如果列表已经存在,我使用脚本向列表添加项目。
了解有关更新API upsert参数的更多信息。
Map

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "PrimaryKey": {
        "type": "keyword"
      },
      "DataField1": {
        "type": "nested"
      }
    }
  }
}

POST my-index-000001/_doc/1
{
  "PrimaryKeyame": 1,
  "DataList": [
    {
      "DataField1": "fieldValue1",
      "DataField2": "fieldValue2"
    }
  ]
}

Bulk将向文档1添加项并创建新文档2(这在索引中不存在)。

POST _bulk
{ "update" : { "_id" : "1", "_index" : "my-index-000001", "retry_on_conflict" : 3} }
{ "script" : { "source": "if (ctx._source.PrimaryKeyame != null) { ctx._source.DataList.addAll(params.DataList); }", "lang" : "painless", "params": { "PrimaryKeyame": "1", "DataList": [{"DataField1": "fieldValue3","DataField2": "fieldValue4"}]}}, "upsert" : {"PrimaryKeyame": "1", "DataList": [{"DataField1": "fieldValue3","DataField2": "fieldValue4"}]}}
{ "update" : { "_id" : "2", "_index" : "my-index-000001", "retry_on_conflict" : 3} }
{ "script" : { "source": "if (ctx._source.PrimaryKeyame != null) { ctx._source.DataList.addAll(params.DataList); }", "lang" : "painless", "params": { "PrimaryKeyame": "2", "DataList": [{"DataField1": "fieldValue3","DataField2": "fieldValue4"}]}}, "upsert" : {"PrimaryKeyame": "2", "DataList": [{"DataField1": "fieldValue3","DataField2": "fieldValue4"}]}}

获取文档:

"hits": [
      {
        "_index": "my-index-000001",
        "_id": "1",
        "_score": 1,
        "_source": {
          "PrimaryKeyame": 1,
          "DataList": [
            {
              "DataField1": "fieldValue1",
              "DataField2": "fieldValue2"
            },
            {
              "DataField2": "fieldValue4",
              "DataField1": "fieldValue3"
            }
          ]
        }
      },
      {
        "_index": "my-index-000001",
        "_id": "2",
        "_score": 1,
        "_source": {
          "PrimaryKeyame": "2",
          "DataList": [
            {
              "DataField1": "fieldValue3",
              "DataField2": "fieldValue4"
            }
          ]
        }
      }
    ]

相关问题