news 2026/4/23 13:33:33

Elasticsearch 结合向量检索:10 分钟为你的电商项目加上“以图搜图”和“语义搜索”功能

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Elasticsearch 结合向量检索:10 分钟为你的电商项目加上“以图搜图”和“语义搜索”功能

🛍️ 前言:你的搜索功能该升级了

做电商项目的兄弟们,是不是还在苦恼这些问题?

  • 用户搜“红色连衣裙”,结果搜不到标题里写着“朱砂红长裙”的商品(关键词不匹配)。
  • 用户看到一张网红同款鞋的照片,想搜同款,但不知道叫什么名字(无法以图搜图)。
  • 搜索结果虽然包含关键词,但完全不是用户想要的东西(缺乏语义理解)。

传统的倒排索引(Inverted Index)已经到了瓶颈。
今天,我们不需要引入新的数据库,直接利用Elasticsearch 8.x的原生向量检索能力,配合开源 Embedding 模型,为你的系统装上“AI 的眼睛”。


🧠 核心原理:万物皆可 Vector

以前我们存商品,存的是 text:“耐克跑鞋”。
现在我们存商品,存的是 vector(向量):[0.12, -0.98, 0.55, ...]

向量检索的魔法在于:

  1. 语义搜索:将“朱砂红长裙”和“红色连衣裙”转换成向量,它们在数学空间里距离非常近,所以能搜出来。
  2. 以图搜图:使用CLIP 模型,它能把“鞋子的图片”和“鞋子的描述文字”映射到同一个向量空间。

架构流程图:

用户请求 (文本/上传图片)
Embedding 模型 (CLIP/BERT)
生成向量 ([0.1, ...])
商品入库
模型向量化
写入 ES (dense_vector)
ES KNN 检索
返回相似商品

🛠️ Step 1: 环境准备与 Mapping 定义

首先,确保你的 Elasticsearch 版本 >= 8.0(低版本虽然也能装插件,但 8.x 原生性能最好)。

我们需要在索引中定义一个dense_vector类型的字段。

PUT/products{"mappings":{"properties":{"name":{"type":"text"},"price":{"type":"double"},"image_url":{"type":"keyword"},"product_vector":{"type":"dense_vector","dims":512,// 维度需与模型输出一致,CLIP通常是512"index":true,"similarity":"cosine"// 使用余弦相似度计算距离}}}}

🐍 Step 2: Python 脚本生成向量 (Embedding)

我们使用 OpenAI 开源的CLIP 模型,它最擅长处理“图文多模态”场景。
安装依赖:pip install sentence-transformers

fromsentence_transformersimportSentenceTransformerfromelasticsearchimportElasticsearch# 1. 连接 ESes=Elasticsearch("http://localhost:9200",basic_auth=("elastic","password"))# 2. 加载 CLIP 模型 (支持多语言和图片)# clip-ViT-B-32 是一个经典的图文匹配模型model=SentenceTransformer('clip-ViT-B-32')# 3. 模拟商品数据products=[{"name":"红色丝绒晚礼服","image":"dress.jpg"},{"name":"复古真皮马丁靴","image":"boots.jpg"}]# 4. 向量化并入库forpinproducts:# 这里演示文本向量化,如果是图片需使用 Image.open()embedding=model.encode(p["name"])doc={"name":p["name"],"product_vector":embedding.tolist()# 转为 List 存入 ES}es.index(index="products",document=doc)print(f"商品{p['name']}已入库")

🔎 Step 3: 发起 KNN 搜索

现在,用户输入了“参加晚宴穿的衣服”(注意:标题里没有这些字),我们要进行语义搜索。

# 用户查询user_query="参加晚宴穿的衣服"query_vector=model.encode(user_query).tolist()# ES KNN 搜索 DSLsearch_body={"knn":{"field":"product_vector","query_vector":query_vector,"k":10,# 返回最相似的 10 个"num_candidates":100},"_source":["name","price"]}res=es.search(index="products",body=search_body)forhitinres['hits']['hits']:print(f"推荐商品:{hit['_source']['name']}(相似度:{hit['_score']})")

预期结果:
虽然用户的搜索词里没有“红”、“丝绒”、“礼服”,但模型“理解”了晚宴需要穿礼服,因此 ES 会高分返回“红色丝绒晚礼服”


🚀 进阶技巧:混合搜索 (Hybrid Search)

在实际电商场景中,向量搜索虽然懂语义,但有时候不够精确(比如搜具体的型号 SKU)。
最佳实践是:关键字搜索 + 向量搜索 混合使用。

在 ES 8.x 中,这非常简单,使用RRF (Reciprocal Rank Fusion)自动融合排名:

GET/products/_search{"knn":{"field":"product_vector","query_vector":[0.1,...],"k":10},"query":{"match":{"name":"晚礼服"}},"rank":{"rrf":{// 倒数排名融合算法"window_size":100,"rank_constant":20}}}

📝 总结

通过引入 Embedding 模型和 ES 的dense_vector,我们没有改动核心架构,没有引入新的重型数据库,就让搜索体验从“人工智障”进化到了“人工智能”。

  • 成本:几乎为 0(开源模型 + 现有 ES 集群)。
  • 收益:解决了长尾词搜索、语义鸿沟和跨模态搜索难题。

AI 时代,不要让你的搜索框还停留在 2010 年。


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

2025年IT人求职指南:当技术优势不再,考个AI证书靠谱吗?

在IT互联网行业干了几年,技术栈更新换代太快,感觉自己那点“老本”越来越不够看了。投出去的简历石沉大海,面试时也感觉没啥特别优势,这种焦虑不少同行都有。 单纯会敲代码、懂运维,在现在这个市场里,已经不算什么稀缺技能了。企业更想要那些能结合新技术,解决业务问题…

作者头像 李华
网站建设 2026/4/23 12:10:19

HoRain云--STM32启动流程全解析

🎬 HoRain 云小助手:个人主页 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

作者头像 李华
网站建设 2026/4/23 10:44:24

大学生就业招聘|基于java + vue大学生就业招聘系统(源码+数据库+文档)

大学生就业招聘 目录 基于springboot vue大学生就业招聘系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于springboot vue大学生就业招聘系统 一、前言 博主介绍…

作者头像 李华
网站建设 2026/4/23 10:44:32

精准匹配,可靠保障:A5E44882190原厂备件的核心价值

在西门子罗宾康高压变频器系统中,每一个组件都承载着确保设备高效、稳定运行的重任。备件A5E44882190作为经过原厂严格设计与测试的正品部件,正是这种卓越工程标准的体现。它并非普通的替换零件,而是为保障复杂功率单元或控制系统精确功能而生…

作者头像 李华
网站建设 2026/4/23 7:00:03

AEAD 加密技术详解及 TLS1.3 应用

一、AEAD 基础原理 1.1 定义与核心特 AEAD (Authenticated Encryption with Associated Data) 是一种同时提供机密性、完整性和认证性的加密技术,能够在单一算法中处理数据加密和验证,解决了传统加密与认证分离方案的安全隐患。其核心特性包括如下几点:…

作者头像 李华