必须配HTTPS和API Key:ES 8.x默认强制启用,地址须以https://开头,认证用base64编码的ApiKey头,开发环境需配置InsecureSkipVerify:true跳过证书校验,版本必须严格对齐(如ES 8.5.3对应v8.5.3)。

用 go-elasticsearch/v8 连接 ES 8.x 集群必须配 HTTPS 和 API Key
ES 8.x 默认强制启用 HTTPS + API Key 认证,elasticsearch.NewDefaultClient() 会连 http://localhost:9200 并直接报 connection refused 或 401 Unauthorized。别试了,它连不上。
- 地址必须显式写成
https://开头,端口通常是9200(HTTP)或9201(HTTPS),得看你的启动参数,不是默认统一的 - 认证不能靠拼
Authorization: BasicHeader —— ES 8.x 已弃用 Basic Auth,要用API Key:把 key base64 编码后塞进Authorization: ApiKey <encoded> - 开发环境跳过证书校验:在
http.Transport里加TLSClientConfig: &tls.Config{InsecureSkipVerify: true};生产环境必须加载 CA 证书 - 版本必须严格对齐:ES 是
8.5.3,就go get github.com/elastic/go-elasticsearch/v8@v8.5.3,写v8会拉最新版,可能 break
bulk 写入静默失败?大概率没调 Do() 或没检查 response.Errors
go-elasticsearch/v7+ 的 bulk 是 builder 模式,所有 .Index().Id().Doc() 都只是内存组装,不调 Do(ctx) 就等于没发请求 —— 日志里完全没痕迹,数据就是丢了。
- 执行后必须检查两个错误层:
err != nil表示网络或序列化失败;response.Errors == true表示部分子请求失败 -
response.Items是[]map[string]interface{},每项要手动取item["index"]["error"]判断是否出错,不能只看 HTTP status - 失败项不能塞回原
bulk对象重试 —— 它内部已标记为 executed,必须新建esutil.BulkIndexer或重新构造bulk实例 - 别按文档条数切分 bulk,按字节更稳:
FlushBytes: 5e+6(5MB)比Size: 1000更抗字段膨胀
同步 MySQL 到 ES 前,MySQL 端三个条件缺一不可
go-mysql-elasticsearch 启动就 panic,不是配置问题,是 MySQL 根本没准备好。它不报错,只 warning,但同步直接停摆。
-
binlog_format必须是ROW,binlog_row_image必须是FULL—— 否则增量日志缺字段,ES 里存的是残缺文档 - 被同步的表必须有主键;没有主键的表会被跳过,日志只写
warning,不 abort,容易漏检 - MySQL 用户至少要有
REPLICATION SLAVE、RELOAD、SUPER权限,光给SELECT不行 - 首次全量依赖
mysqldump,确保运行机器上mysqldump --version能执行,否则直接 crash
字段类型不匹配会导致 document 被整个 reject
ES 不做隐式转换。"123" 写进 integer 字段,不是转成 123,而是直接返回 mapper_parsing_exception,整条文档丢弃 —— bulk 里混着这种数据,你根本不知道哪条挂了。
立即学习“go语言免费学习笔记(深入)”;
- 映射(mapping)必须提前建好,别指望
dynamic mapping猜对类型;text和keyword也得手动指定 - Go struct 字段 tag 要和 mapping 严格对应:
json:"title"对应 mapping 里的"title"字段,大小写、下划线都不能错 - 时间字段建议统一用
time.Time+json:"published_at,string",避免时区或格式错位导致解析失败 - 空值处理要显式:ES 不接受
null写进非nullable字段,Go 里用指针或sql.NullString控制
RetryOnStatus 的 client 在节点抖动时直接放弃重试,或者 mapping 里漏了个 "index": false 导致字段搜不到却查不出原因。这些点不踩一遍,很难真正上线。


















