如何在批量插入时为 Elastic Search 中的 `_id` 属性添加自定义客户端生成的 UUID

问题描述 投票:0回答:1

我正在使用 Elasticsearch docker 镜像版本:docker.elastic.co/elasticsearch/elasticsearch:7.16.2

为了让 ElasticSearch 接受客户端在

UUID
字段上自定义的
_id
,我必须将:
"dynamic": "strict"
属性更改为
true

一直以来,我们一直在

_id
字段中使用严格且自动生成的 UUID。

在检查新插入的文档时,我注意到添加了一个新字段:id,其内容与 _id 元数据字段完全匹配。

这是预期的行为吗?这是实现我打算做的事情的正确方法吗?客户端生成 UUID,然后通过批量插入方法推送到 ELASTIC。

我正在使用 c# 和 dotnet 7 中的 Nest nuget 包。

感谢您的阅读。

通过邮递员

当我尝试通过邮递员插入单个文档时:

可以看到,客户端生成的UUID被分配到了

_id
字段。 Elastic 只是忽略该值并自动为我生成一个新值。

c# elasticsearch .net-core nest
1个回答
0
投票

TDLR;

不,这不是预期的行为。

_id
是一个元数据字段,它不应该是映射的一部分。

所以您不必设置

dynamic: true

解决方案

要在设置

_id
时获取文档,您应该执行以下操作:

POST 77646387/_doc/1
{
  "some": "data"
}

当您搜索此文档时,您应该找到

{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 1,
    "hits": [
      {
        "_index": "77646387",
        "_id": "1",
        "_score": 1,
        "_source": {
          "some": "data"
        }
      }
    ]
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.