新项目必须使用elastic/go-elasticsearch/v9,因olivere/elastic/v7不兼容es 8.0+协议(移除_type、强制https、路径与content-type变更),易返回406或空响应;esapi.searchrequest需显式设置index、body(*bytes.reader)、context(带超时);多字段加权须用boolquery+should+boost,中文需指定analyzer,结果解析须用hit.source,聚合用aggregations方法,注意refresh延迟和字段类型匹配。

新项目必须用 elastic/go-elasticsearch/v9,olivere/elastic/v7 连不上 ES 8.0+,不是代码写错了,是协议断层:ES 移除了 _type、强制 HTTPS、改了 /_search 路径、要求 Content-Type: application/json,v7 完全没适配,一发请求就返回 406 Not Acceptable 或静默空响应。
esapi.SearchRequest 必须显式设 Index、Body 和 Context
esapi.SearchRequest 不补默认值,漏一个字段,ES 就当请求无效,返回空 hits 或 no search context found。
-
Index不能为""或"*";生产环境禁止通配符,ES 可能拒收或打满慢日志;必须明确传[]string{"blogs"} -
Body必须是*bytes.Reader;常见错误是json.Marshal()后忘了包一层bytes.NewReader(),导致请求体为空,ES 返回400 Bad Request -
Context必须带超时,例如context.WithTimeout(ctx, 3*time.Second);不设的话 HTTP client 可能卡死在连接池,goroutine 悬停
多字段加权搜索必须用 BoolQuery + Should + boost
ES 默认不支持字段级权重,multi_match 的 boost 是整个查询层级的,真要控制 title 比 content 权重高 3 倍,得用 BoolQuery 的 Should 显式组合。
Go语言(Golang)1.26.0版本提供 Go 官方 Windows amd64 MSI 安装包下载入口,版本号 1.26.0,可用于旧项目维护、兼容性测试和指定版本开发环境配置。
- 别写
multi_match并幻想"fields": ["title^3", "content"]能生效——它只在multi_match内部起作用,且 v9 客户端要求字段名和 mapping 完全一致(title≠Title) - 正确做法:用
map[string]interface{}构建bool.should数组,每个match单独设boost,例如:map[string]interface{}{"match": map[string]interface{}{"title": map[string]interface{}{"query": "golang", "boost": 3.0}}} - 中文字段必须同步指定
"analyzer": "ik_max_word",否则title用 IK 写入、用 standard 查询,“人工智能”永远匹配不上 - 加权后务必加
"explain": true到 body 里,返回会带评分细节,否则根本看不出是分词切错、还是 boost 没生效
解析结果时 hit.Source 是指针,别直接 Unmarshal 到顶层结构体
ES 返回的文档内容在 hit._source 下,不是 JSON 根对象。直接 json.Unmarshal(raw, &MyDoc{}) 会失败或字段为空。
- 正确做法是调
hit.Source方法:err := json.Unmarshal(*hit.Source, &doc),注意*hit.Source是指针 - 字段名必须和 mapping 完全一致:
user_id≠userId,查不到不会报错,只会返回空 slice - 聚合结果别手动取嵌套 map;用
searchResponse.Aggregations方法(v9 客户端提供),它已处理 key 映射和类型转换
最易被忽略的是 refresh 延迟和字段类型错配:刚 Index 完立刻 Search,大概率为空——ES 默认 1 秒才可搜索;title 字段 mapping 是 keyword,却用 match 查询,必然无结果,因为 keyword 不分词。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










