Elasticsearch向量搜索介绍

你有没有过这种经历?

你想买一双"跑步穿的轻便鞋子",你在电商搜索框输入"透气跑鞋 "。

结果出来的全是"耐克 "、"阿迪达斯"这些品牌名,或者标题里只带了"透气"两个字但其实是皮鞋的商品。

这是因为传统的数据库搜索就像个死板的图书管理员:它只认识字面意思。你搜"苹果",它绝不会给你"iPhone",除非你明确告诉它"苹果=iPhone"。

但现在,AI 时代来了,我们希望搜索能像人类一样思考:你搜"苹果",它不仅给你水果,还能给你手机,甚至给你《白雪公主》的毒苹果。

这就是向量搜索(Vector Search)。今天,我们就用最简单的例子,看看 Elasticsearch 是怎么做到的。


第一部分:把文字变成"坐标"

计算机看不懂文字,只看得懂数字。要让计算机理解"语义",第一步是把文字变成一串数字,这串数字叫向量(Vector)

想象一下二维坐标系(X轴,Y轴):

  • "国王 " 的坐标可能是 [0.9, 0.1]
  • "王后 " 的坐标可能是 [0.8, 0.3]
  • "苹果 " 的坐标可能是 [0.1, 0.9]

在这个地图上,"国王"和"王后"离得很近(都是皇室成员),而"苹果"离它们很远。

现实情况 : 现在的 AI 模型(如 BERT、OpenAI Embeddings)会把文字变成768维甚至更高维 的向量。虽然人类无法想象768维空间,但原理一样:意思越像的词,在这个多维空间里距离越近。

第二部分:向量搜索是怎么工作的?

当你把数据存入 Elasticsearch 时,不仅要存文字,还要存它对应的向量(那一长串数字)。

场景 : 你要找"一种红色的水果"。

  1. 向量化 : ES 先把你的搜索词"一种红色的水果"也转换成向量,假设是 [0.2, 0.8]
  2. 找邻居 : ES 拿着这个坐标,去数据库里找离它物理距离最近的向量。
  3. 返回结果
    • 向量 [0.1, 0.9](苹果) -> 距离 0.14(很近!)
    • 向量 [0.3, 0.7](草莓) -> 距离 0.14(很近!)
    • 向量 [0.9, 0.1](西红柿1) -> 距离 0.9(有点远)
    • 向量 [0.8, 0.2](胡萝卜) -> 距离 1.0(太远了,不要)

结果 : 哪怕你没提"苹果"这两个字,只要你描述了它的特征,ES 也能把它找出来!这就是语义搜索


第三部分:实战!3 分钟用 ES 跑通向量搜索

别被"高维数学"吓到了,在 Elasticsearch 8.x/9.x 里,操作简单得像写 SQL。

1. 准备工作:创建一个带向量的索引

我们要建一个存放"文档"的仓库,并告诉 ES:"这里的 text_embedding 字段是向量,有 3 个维度(为了演示简单,实际通常是 768+)"。

json 复制代码
PUT /my_blog_index
{
  "mappings": {
    "properties": {
      "title": { "type": "text" },
      "text_embedding": {
        "type": "dense_vector",
        "dims": 3,
        "index": true,
        "similarity": "cosine" 
      }
    }
  }
}

解释:dense_vector 就是告诉 ES 这是个向量字段;similarity 定义了怎么算距离(余弦相似度是最常用的)。

2. 插入数据(模拟 AI 已经帮我们转好了向量)

假设 AI 模型已经把我们的文章标题变成了向量:

json 复制代码
POST /my_blog_index/_bulk
{ "index": { "_id": 1 } }
{ "title": "如何做番茄炒蛋", "text_embedding": [0.1, 0.5, 0.8] }
{ "index": { "_id": 2 } }
{ "title": "苹果手机最新评测", "text_embedding": [0.2, 0.6, 0.7] }
{ "index": { "_id": 3 } }
{ "title": "红烧肉的做法", "text_embedding": [0.9, 0.1, 0.2] }
3. 搜索:我想找"水果相关的食谱"

我脑海里想的是"水果",AI 把"水果"转换成了向量 [0.15, 0.55, 0.75]

执行搜索(KNN - K Nearest Neighbors):

json 复制代码
GET /my_blog_index/_search
{
  "knn": {
    "field": "text_embedding",
    "query_vector": [0.15, 0.55, 0.75],
    "k": 2,
    "num_candidates": 100
  },
  "_source": ["title"]
}

预测结果

ES 会计算距离,发现 [0.1, 0.5, 0.8](番茄炒蛋)和 [0.2, 0.6, 0.7](苹果评测)离我的查询向量最近。

虽然"番茄炒蛋"里没有"水果"二字,但在向量空间里,它和"水果"的语义更接近(比如都含有维生素、植物等潜在语义),所以它会排在"红烧肉"前面。


第四部分:ES 向量搜索的"杀手锏"

你可能会问:"我为什么要用 ES?专门的向量数据库不是更强吗?"

Elasticsearch 的最大优势在于:它是"混合"的王者。

  1. Hybrid Search(混合搜索)

    有时候你需要既精确又模糊。比如搜"红色的 iPhone 15 手机壳"。

    • 传统搜索(BM25):确保结果里必须有"iPhone 15"这个词(精确)。
    • 向量搜索(KNN):确保结果里包含"好看的"、"防摔的"等语义(模糊)。
    • ES 可以用 RRF (Reciprocal Rank Fusion) 算法把两者分数一综合,给你最完美的结果。
  2. 元数据过滤(Pre/Post Filtering)

    "给我找2023年以后 发布的、价格低于50元 的、语义上像 '运动鞋'的商品。"

    在向量搜索的同时,直接加上 price < 50date > 2023 的过滤条件,效率极高。

  3. 生态完善

    你不需要维护两套系统(一套存业务数据,一套存向量)。ES 全搞定,而且还能顺便做日志分析、全网搜索。

总结

Elasticsearch 的向量搜索并不是什么黑魔法,它就是:

  1. Embedding:用 AI 模型把字变成数字坐标。
  2. Indexing:把坐标存进专门的数据结构(HNSW 图)里加速查找。
  3. Searching:算出"你的问题"和"库存数据"在数学上的距离。

如果你还在用 LIKE %...% 做搜索,或者被精确匹配折磨得头秃,赶紧试试 ES 的向量搜索吧。让你的搜索框,真正读懂用户的心。


注:1 在植物学上,西红柿确实是水果,但在菜市场它是蔬菜。这正好体现了传统搜索的尴尬和向量搜索的灵活性------取决于你的训练数据!

相关推荐
大模型码小白10 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
阿里云大数据AI技术12 小时前
更快、更稳、更省:揭秘阿里云 Elasticsearch 存算分离与弹性扩缩
elasticsearch
延凡科技12 小时前
多场景落地复盘:端边云架构无人机智能巡检系统设计与实践
大数据·数据结构·人工智能·科技·架构·无人机·能源
ifenxi爱分析13 小时前
爱分析最新报告解读:AI数据基础设施与数据中台的区别
大数据·人工智能
阿里云大数据AI技术14 小时前
Search Lake:ES x Paimon 让湖上多模态数据可搜可用
人工智能·elasticsearch·搜索引擎
品牌全球行14 小时前
共商共建共享 链接数字未来——“一带一路数字新城(深圳)会客厅筹备办”揭牌仪式在深圳隆重举行
大数据·人工智能
数智化管理手记16 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘
ApacheSeaTunnel17 小时前
Apache SeaTunnel AI CLI Benchmark:7 款大模型、100 个 ETL 任务实测,谁真正能跑起来?
大数据·ai·开源·大模型·数据集成·cli·seatunnel·技术分享·数据同步
电商API_1800790524717 小时前
企业ERP进销存场景|京东商品详情接口自动同步方案|凭证鉴权批量调用技术实操
大数据·运维·人工智能·爬虫·数据挖掘·网络爬虫
小稻穗17 小时前
市场调研样本选型坐标系:2026六家国内样本平台能力横向校验
大数据·运维·数据分析