发布于2026-07-14 阅读(0)
扫一扫,手机访问
ES 8.0+ 必须用 elastic/go-elasticsearch/v9,olivere/elastic/v7 连都连不上——不是你代码写错了,是协议断层导致静默失败。
ES 8.0+ 移除了 _type、强制 HTTPS、调整了 /_search 路径、要求 Content-Type: application/json,而 olivere/elastic/v7 完全没适配这些变更。现象是:req.Do() 返回空 hits 或直接 406 Not Acceptable,日志里还看不到真实原因。
olivere/elastic/v7(仅限存量迁移)elastic/go-elasticsearch/v9context.Context 传参冲突、http.RoundTripper 复用异常,可能静默超时esapi.SearchRequest 必须显式设三个字段官方客户端不补默认值,漏一个就等于发了个废请求:返回空结果、no search context found 或 panic。
Index:不能为 "" 或 "*";生产环境禁止通配符,ES 可能拒收或打满慢日志;必须明确传 []string{"blogs"}Body:必须是 *bytes.Reader;常见错误是 json.Marshal() 后忘了包一层 bytes.NewReader(),导致请求体为空,ES 返回 400 Bad RequestContext:必须带超时,例如 context.WithTimeout(ctx, 3*time.Second);不设的话 HTTP client 可能卡死在连接池,goroutine 悬停90% 的“搜不到”不是 query 写错,而是索引侧配置和写入行为不一致。
ik_max_word,但查询 DSL 没加 "analyzer": "ik_max_word",ES 默认走 standard 分词器——“人工智能”被切成 “人工”“智能”,而 IK 会切出完整词项,自然匹配不上refresh 延迟:文档写入后默认 1 秒才可搜索;刚 Index() 完立刻 Search(),大概率为空;开发期可临时加 Refresh: "true",但批量导入时严禁使用title 字段 mapping 是 keyword,却用 MatchQuery 查——keyword 不分词,MatchQuery 查不了;该用 TermQueryhit.Source 时最容易 panicES 返回的文档内容在 hit._source 下,不是 JSON 根对象。直接 json.Unmarshal(raw, &MyDoc{}) 会失败或字段为空。
hit.Source 方法:err := json.Unmarshal(hit.Source, &doc)hit.Source 为 nil(比如设置了 Source: false),直接解码会 panicif hit.Source != nil { json.Unmarshal(hit.Source, &doc) }真正麻烦的从来不是怎么写 query,而是 mapping 设对没、分词器配准没、refresh 控制得当没、client 版本和 ES 版本咬合没——这些点一错,查半天也看不出哪错了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8