news 2026/6/10 14:17:12

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/6/10 13:35:15

❾⁄₁ ⟦ OSCP ⬖ 研记 ⟧ 防病毒软件规避 ➱ 防病毒软件概述(上)

郑重声明:本文所涉安全技术仅限用于合法研究与学习目的,严禁任何形式的非法利用。因不当使用所导致的一切法律与经济责任,本人概不负责。任何形式的转载均须明确标注原文出处,且不得用于商业目的。 🔋 点赞 | 能量注入…

作者头像 李华
网站建设 2026/6/5 16:46:51

Kotaemon如何实现跨文档关联?深层推理能力展示

Kotaemon如何实现跨文档关联?深层推理能力展示 在企业知识库日益庞杂的今天,一个简单的业务问题往往牵涉多份合同、报告或数据库记录。比如:“对比A公司在2020和2021年财报中提到的风险因素,并分析其对投资回报率的影响。”——这…

作者头像 李华
网站建设 2026/6/5 17:37:41

TCP IP核数据手册解读

文章目录 前言 一、用途 二、特点 三、连接方式 3.1 双绞线连接:FPGA外挂PHY芯片 3.2 光纤连接:有对应的Phy ip核 四、接口信号解释 4.1 系统信号 4.2 网络参数信号 4.3 PHY接口信号 4.4 TCP接口信号 4.5 UDP接口信号 五、接口信号时序 5.1 TCP 建立连接信号时序 5.2 TCP写时…

作者头像 李华
网站建设 2026/6/9 17:25:07

HoRain云--Python长连接实现:4种高效方案详解

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

作者头像 李华
网站建设 2026/6/7 2:10:39

校园跑腿|基于java+ vue校园跑腿系统(源码+数据库+文档)

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

作者头像 李华
网站建设 2026/6/9 12:43:01

分布计算系统大题

本题要求对分布式系统中的共享资源问题与多副本数据问题进行综述。以下答案将根据您提供的资料进行组织和引用。五、综述题 1、哪些问题与共享资源相关,以及对应的解决办法? 在分布计算系统中,共享资源的使用是核心问题之一。由于资源的分散性…

作者头像 李华