{
  "name": "es-sink-orders",

  "config": {
    "_doc": "Elasticsearch Sink - 把 shop.orders Topic 的消息以 PK 幂等覆盖到 ES",

    "connector.class": "io.confluent.connect.elasticsearch.ElasticsearchSinkConnector",
    "tasks.max": "3",

    "_topic_doc": "订阅一个或多个 topic（topic == ES index 名，自动小写）",
    "topics": "shop.orders",

    "_es_doc": "ES 集群连接，可配置多节点用逗号隔开",
    "connection.url": "http://es-node:9200",
    "connection.username": "elastic",
    "connection.password": "elastic-secret-CHANGE-ME",

    "_doc_id_doc": "用 message key 作 ES 文档 ID，实现『同主键覆盖』幂等",
    "key.ignore": "false",
    "schema.ignore": "true",

    "_write_mode_doc": "INSERT vs UPSERT - 一般 ES 用 upsert（不存在就新建，存在就部分更新）",
    "write.method": "upsert",

    "_bulk_doc": "ES bulk 写参数 - 调大 batch 提吞吐",
    "batch.size": "2000",
    "max.in.flight.requests": "5",
    "linger.ms": "1000",
    "flush.timeout.ms": "30000",
    "max.buffered.records": "20000",
    "max.retries": "5",
    "retry.backoff.ms": "1000",

    "_delete_doc": "value=null 的墓碑消息 → ES DELETE",
    "behavior.on.null.values": "delete",
    "behavior.on.malformed.documents": "warn",

    "_converter_doc": "和 Source 的 Converter 对齐",
    "key.converter": "org.apache.kafka.connect.json.JsonConverter",
    "value.converter": "org.apache.kafka.connect.json.JsonConverter",
    "key.converter.schemas.enable": "false",
    "value.converter.schemas.enable": "false",

    "_error_doc": "宽松错误：所有 ES 4xx 单行错误丢 DLQ；只有 5xx 类系统错才 fail",
    "errors.tolerance": "all",
    "errors.log.enable": "true",
    "errors.log.include.messages": "true",
    "errors.deadletterqueue.topic.name": "dlq.es-sink-orders",
    "errors.deadletterqueue.topic.replication.factor": "3",
    "errors.deadletterqueue.context.headers.enable": "true",

    "_consumer_doc": "consumer 端的 isolation.level 必须 read_committed 才能配合 Source EOS",
    "consumer.override.isolation.level": "read_committed",
    "consumer.override.max.poll.records": "500"
  }
}
