news 2026/4/12 10:13: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/3/29 4:41:56

leetCode每日一题:按策略买卖股票的最佳时机

下面我把 LeetCode 3652:按策略买卖股票的最佳时机 完整做一遍:从建模 → 思路 → 算法 → 代码(含详细注释),一步一步来。 原题: 给你两个整数数组 prices 和 strategy,其中:prices…

作者头像 李华
网站建设 2026/4/12 1:17:57

滑动窗口算法

滑动窗口 面试 & 刷题里性价比最高的算法之一什么时候用 → 本质 → 固定窗口 → 变长窗口 → 判断口诀一、一句话先建立直觉(最重要)当你在一个“连续区间”上,反复计算某个指标,且每次只移动一点点时,就该想到滑…

作者头像 李华
网站建设 2026/4/6 0:10:26

Kotaemon与国产芯片适配进展:已在昇腾环境成功运行

Kotaemon与国产芯片适配进展:已在昇腾环境成功运行 在金融、政务等对数据安全要求极高的行业,如何构建一套既高效又可控的智能对话系统?这不仅是技术选型的问题,更是一场关于算力自主、生态闭环和工程落地能力的综合考验。近年来&…

作者头像 李华
网站建设 2026/4/4 9:07:42

智能销售管理系统VertGrow AI销冠助力企业提升获客效率和转化率

智能销售管理系统提升企业转化率的关键成功因素在当今竞争激烈的市场中,企业需要充分利用智能销售管理系统来提升获客效率。使用智能获客软件,企业可以实现主动获客,从而迅速扩大客户基础。另外,结合AI销售工具与销售软件的工作流…

作者头像 李华
网站建设 2026/4/11 16:10:17

VS Code 中可免费使用的 AI 编程插件

🏆 顶级推荐(完全免费) 1. GitHub Copilot(学生/开源项目免费) {"名称": "GitHub Copilot","类型": "代码补全/生成","免费条件": "学生、教师、流行开源项目…

作者头像 李华
网站建设 2026/3/31 16:46:16

5.3 马尔可夫过程与隐马尔可夫模型:序列建模基础

5.3 马尔可夫过程与隐马尔可夫模型:序列建模基础 现实世界中的许多数据,如语音信号、基因序列、文本单词、金融时间序列等,本质上都是有序的序列。与独立同分布的假设不同,序列数据中的观测值之间存在显著的时间或顺序依赖关系。对这些依赖关系进行建模,是人工智能在语音…

作者头像 李华