当前位置: 首页 > news >正文

已经有域名 如何建网站社保网站哪里做转入

已经有域名 如何建网站,社保网站哪里做转入,wordpress 如何汉化主题,办公oa管理系统1. 场景与思路痛点:把“文本内容”转成向量后,如何在本地 Redis 里做近似向量搜索(KNN),而不依赖外部向量数据库?方案: 利用 HuggingFace 模型 sentence-transformers/all-MiniLM-L6-v2 生成 38…

1. 场景与思路

  • 痛点:把“文本内容”转成向量后,如何在本地 Redis 里做近似向量搜索(KNN),而不依赖外部向量数据库?

  • 方案

    1. 利用 HuggingFace 模型 sentence-transformers/all-MiniLM-L6-v2 生成 384 维 Float32 向量;
    2. 借助 RediSearchHNSW 索引能力,在 Hash 或 JSON 文档里存储 & 查询向量;
    3. go-redis v9 的高阶 API(FTCreate / FTSearch / FTAggregate)完成端到端流程。

2. 环境准备

# 初始化 Go Module
go mod init vecexample# 安装依赖
go get github.com/redis/go-redis/v9
go get github.com/henomis/lingoose/embedder/huggingface

⚠️ Redis 服务器

  • 启动模块:redis-stackredis-stack-server 或自行加载 redisearch.so + rejson.so
  • go-redis 建议 Protocol: 2 (RESP2),避免 RESP3 生僻结构的解析开销。

3. 连接 Redis

ctx := context.Background()rdb := redis.NewClient(&redis.Options{Addr:     "localhost:6379",Protocol: 2, // RESP2 更省心
})

4. 创建索引(Hash 版)

_, _ = rdb.FTDropIndexWithArgs(ctx,"vector_idx",&redis.FTDropIndexOptions{DeleteDocs: true},
) // 防止重复_, err := rdb.FTCreate(ctx, "vector_idx",&redis.FTCreateOptions{OnHash: true,Prefix: []any{"doc:"}, // 监听 doc:* 键},&redis.FieldSchema{FieldName: "content", FieldType: redis.SearchFieldTypeText},&redis.FieldSchema{FieldName: "genre",   FieldType: redis.SearchFieldTypeTag},&redis.FieldSchema{FieldName: "embedding",FieldType: redis.SearchFieldTypeVector,VectorArgs: &redis.FTVectorArgs{HNSWOptions: &redis.FTHNSWOptions{Dim: 384, Type: "FLOAT32", DistanceMetric: "L2",},},},
).Result()
if err != nil { panic(err) }

5. 生成文本 Embedding

hf := huggingfaceembedder.New().WithToken(os.Getenv("HF_TOKEN")).                 // HuggingFace 访问令牌WithModel("sentence-transformers/all-MiniLM-L6-v2")sentences := []string{"That is a very happy person","That is a happy dog","Today is a sunny day",
}
tags := []string{"persons", "pets", "weather"}embs, _ := hf.Embed(ctx, sentences)

将 []float32 转成字节串(Hash 专用)

func floatsToBytes(fs []float32) []byte {buf := make([]byte, len(fs)*4)for i, f := range fs {binary.LittleEndian.PutUint32(buf[i*4:], math.Float32bits(f))}return buf
}

6. 写入 Hash 文档并自动索引

for i, emb := range embs {_, _ = rdb.HSet(ctx, fmt.Sprintf("doc:%d", i), map[string]any{"content":   sentences[i],"genre":     tags[i],"embedding": floatsToBytes(emb.ToFloat32()),}).Result()
}

7. KNN 查询

qEmb, _ := hf.Embed(ctx, []string{"That is a happy person"})
buf := floatsToBytes(qEmb[0].ToFloat32())res, _ := rdb.FTSearchWithArgs(ctx,"vector_idx","*=>[KNN 3 @embedding $vec AS score]",&redis.FTSearchOptions{Return: []redis.FTSearchReturn{{FieldName: "score"},{FieldName: "content"},},Params: map[string]any{"vec": buf},DialectVersion: 2,},
).Result()for _, d := range res.Docs {fmt.Printf("%s\t%v\n", d.Fields["content"], d.Fields["score"])
}

输出示例

That is a very happy person     0.114...
That is a happy dog             0.610...
Today is a sunny day            1.486...

8. 聚合统计:每类文本数量

agg, _ := rdb.FTAggregateWithArgs(ctx,"vector_idx", "*",&redis.FTAggregateOptions{GroupBy: []redis.FTAggregateGroupBy{{Fields: []any{"@genre"},Reduce: []redis.FTAggregateReducer{{Reducer: redis.SearchCount, As: "cnt"},},},},},
).Result()for _, row := range agg.Rows {fmt.Printf("%s : %v\n", row.Fields["genre"], row.Fields["cnt"])
}

9. 切换 JSON 存储的关键差异

步骤HashJSON
FTCreateOnHash:trueOnJSON:true;字段用 $.path + As
写入方式HSet("doc:*", ...) + 字节串JSONSet("jdoc:*", "$", ...) + []float32 原样
查询参数依旧传字节串依旧传字节串(参数统一编码)
结果字段字段直接展开字段在 Fields["$"] 内或按别名返回

JSON 写入示例

_, _ = rdb.FTCreate(ctx, "vector_json_idx",&redis.FTCreateOptions{OnJSON: true, Prefix: []any{"jdoc:"}},&redis.FieldSchema{FieldName: "$.content", As: "content", FieldType: redis.SearchFieldTypeText},&redis.FieldSchema{FieldName: "$.genre",   As: "genre",   FieldType: redis.SearchFieldTypeTag},&redis.FieldSchema{FieldName: "$.embedding", As: "embedding",FieldType: redis.SearchFieldTypeVector,VectorArgs: &redis.FTVectorArgs{HNSWOptions: &redis.FTHNSWOptions{Dim: 384, Type: "FLOAT32", DistanceMetric: "L2"},},},
).Result()for i, emb := range embs {_, _ = rdb.JSONSet(ctx, fmt.Sprintf("jdoc:%d", i), "$", map[string]any{"content":   sentences[i],"genre":     tags[i],"embedding": emb.ToFloat32(), // 直接存数组!}).Result()
}

10. 常见问题 & 排错

问题可能原因 / 解决
ERR unknown index name忘记先 FT.CREATE 或 Index 名写错
查询报 Property is not a vector向量字段未被识别:检查 FieldType、Dim、Type
向量搜索速度慢调整 HNSW 参数 EF_CONSTRUCTION / M,或增加内存
RESP3 解析困难使用 Protocol:2,或调用 RawResult() 自行解析

11. 结语

通过 go-redis + RediSearch,你可以在本地 Redis 轻松实现:

  1. 文本 Embedding 近似搜索(KNN & 距离排名)
  2. 多条件过滤、聚合分析 与传统全文搜索混合使用
  3. Hash 与 JSON 双存储的无缝切换

这使得 Redis 成为“小而全”的 实时语义检索引擎。复制本文代码,即刻在你的业务中解锁 AI 搜索能力吧!🚀

http://www.dtcms.com/a/404558.html

相关文章:

  • 关于自行建设门户网站的请示长春做网站大公司
  • 凡科删除建设的网站开发流程有哪些阶段
  • 高校文明建设网站seo伪原创工具
  • 美丽寮步网站建设wordpress博客数据放在哪里的
  • 大型网站建设兴田德润实惠公司域名备案
  • 厦门手机网站制作做内部网站费用
  • 机械厂网站建设方案wordpress打开越来越慢
  • 天河网站建设方案做淘宝客没网站吗
  • 为什么做旅游网站用国外网站 图片做自媒体
  • 网站设计英文网架加工费多少钱一吨
  • 重庆手机网站方案设计吉林学校网站建设
  • 哪个网站可以做线上翻译赚钱广州电子商务网站建设
  • [优选算法专题三二分查找——NO.19x 的平方根 ]
  • 网站后台管理系统 模板深圳网站网页制作
  • 网站退出率是什么意思做外贸产品上什么网站
  • 网站开发 小程序开发如何做百度推广的网站
  • 网页制作怎么做多个网站网站设计的基本流程是什么
  • oracle 网站开发网站在只有域名了
  • 四川做网站设计的公司搜索服务公司
  • 在线建站网页制作网站建设平台大型农村电商平台
  • 单页网站在线制作如何在百度开个网站
  • 成都手机网站建设哪网站如何做淘宝客
  • [优选算法专题三.二分查找——NO.20搜索插入位置 ]
  • 顺德品牌网站建设公司西安建百度网站的公司
  • 快递网站怎么制作深圳科技公司
  • 建设银行英文网站有什么网站可以做婚庆视频素材
  • SQLAlchemy 库
  • 给赌场做网站容桂销售型网站建设
  • 经典字符串与数组题目
  • 美团初期是怎么建网站微信的官方首页