如何在OpenSearch中禁用文档自动ID生成功能?
禁用OpenSearch自动生成文档ID的实现方式
OpenSearch没有直接的全局配置开关来禁用自动生成文档ID,但可以通过以下几种方式实现“必须显式指定ID才能创建文档”的需求:
1. 使用_create API替代_doc API
直接改用index/_create/<id>接口创建文档,这个接口本身要求必须显式指定文档ID。如果尝试不指定ID发送请求(比如POST index/_create),OpenSearch会直接返回错误:
{ "error": { "root_cause": [ { "type": "action_request_validation_exception", "reason": "Validation Failed: 1: create requires an ID;" } ], "type": "action_request_validation_exception", "reason": "Validation Failed: 1: create requires an ID;" }, "status": 400 }
2. 通过Ingest Pipeline强制校验文档ID
创建包含脚本处理器的Ingest Pipeline,在文档索引前检查_id是否为空,若为空则抛出错误:
- 创建Pipeline:
PUT _ingest/pipeline/require_doc_id { "processors": [ { "script": { "source": "if (ctx._id == null || ctx._id == '') { throw new IllegalArgumentException('Document ID must be explicitly specified'); }" } } ] }
- 将该Pipeline设置为索引的默认Pipeline(或在索引请求中指定使用):
PUT my_index/_settings { "index.default_pipeline": "require_doc_id" }
之后,尝试不指定ID发送POST my_index/_doc请求时,会被Pipeline拦截并返回错误。
3. 权限控制限制无ID索引操作
创建自定义角色,禁止用户执行不带ID的_doc索引操作:
- 拒绝角色对
index/_doc的POST权限(无ID创建时用该请求方式) - 只允许角色执行带ID的
PUT index/_doc/<id>或POST index/_doc/<id>操作
通过这种权限控制,可以从访问层面强制用户必须指定文档ID才能创建文档。
内容的提问来源于stack exchange,提问作者Arthur Caccavo
相关产品推荐
相关产品推荐

