news 2026/4/15 12:24:02

golang调用 elasticsearch 8,向量检索

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
golang调用 elasticsearch 8,向量检索

go get github.com/elastic/go-elasticsearch/v8

文档:https://www.elastic.co/docs/reference/elasticsearch/clients/go/getting-started#_indexing_documents

下载解压 elasticsearch-8.10.4

D:\dev\php\magook\trunk\server\elasticsearch-8.10.4\bin elasticsearch.bat
D:\dev\php\magook\trunk\server\elasticsearch-headnpmrun start

访问:http://127.0.0.1:9200/

访问:http://localhost:9100/

如果有向量类型的字段,需要先定义 mappings。

还需要特别注意的是 embedding 维度要匹配,elasticsearch中的dense_vector类型,在版本8.0 – 8.11中,默认的最高维度是2048,在 **8.12+**之后是4096,当然,这个值越高计算越慢。数据的维度必须小于es能存储的维度,否则会报错。

此处采用火山引擎的模型doubao-embedding-large-text-250515,其维度是2048,参考 模型列表

packagemainimport("bytes""context""encoding/json""fmt""log""os""strings""github.com/cloudwego/eino-ext/components/embedding/ark""github.com/elastic/go-elasticsearch/v8""github.com/elastic/go-elasticsearch/v8/esapi")funcmain(){client,err:=elasticsearch.NewClient(elasticsearch.Config{Addresses:[]string{"http://localhost:9200"},})iferr!=nil{log.Panicf("connect es8 failed, err=%v",err)}////////////////////////////////////////////createIndex(client,"my_index_vector")////////////////////////////////////////////ctx:=context.Background()ebs,err:=ark.NewEmbedder(ctx,&ark.EmbeddingConfig{BaseURL:os.Getenv("ARK_BASE_URL"),APIKey:os.Getenv("ARK_API_KEY"),Model:os.Getenv("ARK_EMBEDDING_MODEL"),})iferr!=nil{panic(err)}content:="Eino 旨在提供 Golang 语言的 AI 应用开发框架。 Eino 参考了开源社区中诸多优秀的 AI 应用开发框架,例如 LangChain、LangGraph、LlamaIndex 等,提供了更符合 Golang 编程习惯的 AI 应用开发框架。"res,err:=ebs.EmbedStrings(ctx,[]string{content})iferr!=nil{panic(err)}fmt.Println("info: ",len(res),len(res[0]))indexDocument(client,"my_index_vector","1",Document{Title:"Eino是什么",Content:content,Embedding:res[0],})}funccreateIndex(es*elasticsearch.Client,indexNamestring){mapping:=`{ "mappings": { "properties": { "title": { "type": "text" }, "content": { "type": "text" }, "embedding": { "type": "dense_vector", "dims": 2048, "index": true, "similarity": "cosine" } } } }`req:=esapi.IndicesCreateRequest{Index:indexName,Body:strings.NewReader(mapping),}res,err:=req.Do(context.Background(),es)iferr!=nil{log.Fatalf("Error creating index: %s",err)}deferres.Body.Close()ifres.IsError(){log.Printf("Error: %s",res.String())}else{fmt.Println("Index created successfully")}}typeDocumentstruct{Titlestring`json:"title"`Contentstring`json:"content"`Embedding[]float64`json:"embedding"`}funcindexDocument(es*elasticsearch.Client,indexName,idstring,doc Document){data,_:=json.Marshal(doc)req:=esapi.IndexRequest{Index:indexName,DocumentID:id,Body:strings.NewReader(string(data)),Refresh:"true",}res,err:=req.Do(context.Background(),es)iferr!=nil{log.Fatalf("Error indexing document: %s",err)}deferres.Body.Close()ifres.IsError(){log.Printf("Error: %s",res.String())}else{fmt.Printf("Document %s indexed\n",id)}}

输出

Index created successfully info:12048Document1indexed

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/8 18:30:55

移动端自动化测试:工具选择与实战技巧深度解析

一、移动端自动化测试现状与挑战随着智能设备渗透率持续攀升,移动应用功能复杂度呈指数级增长。截至2025年,全球移动用户日均使用时长突破4小时,这对测试工作提出更高要求。传统手工测试面临三大瓶颈:设备碎片化(需覆盖…

作者头像 李华
网站建设 2026/3/30 10:05:27

升级竞价思维:从被动跟随到主动布局的策略进化

在亚马逊广告投放的竞技场中,“系统建议出价”曾像海妖的歌声一般,诱惑着无数卖家踏入高成本低回报的迷雾,直到越来越多的人发现,这一“友好”的工具背后,潜藏着一套精密的算法逻辑——它并非以卖家的利润最大化为目的…

作者头像 李华
网站建设 2026/4/8 10:08:57

汽车行业最严重漏洞:20家知名车企API暴露车主个人信息

汽车行业最严重漏洞:20家知名车企API暴露车主个人信息 近日安全研究人员Sam Curry披露了近20家知名汽车制造商在线服务中的API安全漏洞,这些漏洞可能允许黑客执行恶意活动,包括从解锁、启动、跟踪汽车到窃取客户个人信息。这可能是汽车行业迄…

作者头像 李华
网站建设 2026/4/9 5:37:09

SVN 某个用户 进项目需要常常输入密码

用户输入密码后 大约10多分钟还需要再输入密码: 1. Linux 首先 我查看了 该用户确实有权限 其次开始操作,让该用户进入/home/xx 下 删除隐藏文件 .subversion/ 再开始 操作 svn co 或 svn ls 触发 输入密码的操作,即可,可…

作者头像 李华
网站建设 2026/4/13 22:14:24

Inventor 二次开发从入门到精通(6)

5.4 装配体文档的核心操作装配体文档(AssemblyDocument)的核心是零部件的装配和约束,通过 API 可实现零部件的批量插入、约束添加和位置调整。5.4.1 创建装配体文档并插入零部件// 创建装配体文档 AssemblyDocument assyDoc (AssemblyDocume…

作者头像 李华
网站建设 2026/4/11 19:39:07

14、DB2 应用开发全解析:从并发控制到应用构建

DB2 应用开发全解析:从并发控制到应用构建 并发控制与事务处理 在数据库操作中,并发控制和事务处理是确保数据完整性的关键。不同并发级别会影响数据的访问和管理,而设置隔离级别可以有效处理这些问题,为应用和数据需求提供最大灵活性。同时,还需要关注锁升级、锁等待、…

作者头像 李华