新项目必须用elastic/go-elasticsearch/v9,因olivere/elastic/v7不兼容es 8.0+:协议断层致406错误或静默失败,v9适配移除_type、强制https、_search路径变更及content-type要求。

新项目必须用 elastic/go-elasticsearch/v9,olivere/elastic/v7 在 ES 8.0+(包括刚装的 8.15 / 9.0)上根本连不上——不是代码写错,是协议断层:ES 移除了 _type、强制 HTTPS、调整了 /_search 路径、要求 Content-Type: application/json,v7 完全没适配,请求发出去直接返回 406 Not Acceptable 或静默空响应。
为什么 esapi.SearchRequest 总是返回空 hits
因为官方客户端不补默认值,漏一个字段就等于发了个废请求,ES 不报错,只返回空结果或 no search context found。
-
Index必须是[]string{"blogs"},不能为""或"*";生产环境 ES 会拒收通配符,也可能打满慢日志 -
Body必须是*bytes.Reader;常见错误是json.Marshal()后忘了包一层bytes.NewReader(),导致请求体为空,ES 返回400 Bad Request -
Context必须带超时,例如context.WithTimeout(ctx, 3*time.Second);不设的话 HTTP client 可能卡死在连接池,goroutine 悬停
中文多字段加权搜索怎么写才真生效
别信 multi_match 里写 "fields": ["title^3", "content"] 就能控制权重——它只在 query 内部起作用,且 v9 客户端要求字段名和 mapping 完全一致(title ≠ Title)。
Colly 是一个用于 Go 语言的快速开源爬取和爬虫框架。它适用于从简单的页面提取到异步爬虫处理大量页面集合,支持请求回调和结构化解析。
- 真要让
title权重是content的 3 倍,得用BoolQuery+Should显式组合,每个match单独设boost - 中文字段必须同步指定
"analyzer": "ik_max_word",否则索引用 IK 写入、查询走standard分词器,“人工智能”永远匹配不上 - 加权后务必在 body 里加
"explain": true,返回会带评分细节,否则根本看不出哪段 boost 没生效
Gin 中解析 hit.Source 为什么总 panic
ES 返回的文档内容在 hit._source 下,不是顶层 JSON;直接 json.Unmarshal(raw, &MyDoc{}) 会失败或字段为空,甚至 panic。
- 正确做法是调
hit.Source方法:err := json.Unmarshal(*hit.Source, &doc),注意*hit.Source是指针 - 结构体字段名必须和 mapping 定义完全一致:
product_name≠productName,大小写、下划线都不能错 - 如果用了
_source: false或字段被 exclude,hit.Source可能为nil,解引用前得判空
最常被跳过的其实是 refresh 延迟和字段类型对齐:文档写入后默认 1 秒才可搜索,刚 Index() 完立刻 Search() 大概率为空;title 字段 mapping 是 keyword 却用 MatchQuery 查,查不到也不会报错,只会返回空切片。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










