不要急,总有办法的

INFINI Easysearch 向量搜索实战(一)

EasysearchINFINI Labs 小助手 发表了文章 • 0 个评论 • 531 次浏览 • 18 小时前 • 来自相关话题


![](https://infinilabs.cn/img/blog ... er.jpg)

[Easysearch](https://easysearch.cn) 提供了强大的向量搜索能力,打破传统关键词匹配的局限,实现真正的“懂你”的语义搜索。助力企业快速构建智能推荐、图像识别和内容理解等 AI 应用,释放数据深层价值。

核心能力


| 能力 | 说明 |
| ------------------- | --------------------------------------------------------------------------------------------------------- |
| 两种向量类型 | 稠密浮点向量(knn_dense_float_vector)和稀疏布尔向量(knn_sparse_bool_vector) |
| 多种索引模型 | lsh(局部敏感哈希,近似搜索)、permutation_lsh(置换 LSH)、sparse_indexed(倒排索引)、exact(精确搜索) |
| 多种相似度 | cosine(余弦)、l1(曼哈顿距离)、l2(欧氏距离)、jaccard、hamming |
| 与全文搜索融合 | 向量字段与文本字段存储在同一索引,支持 Hybrid 混合检索 |
| function_score 集成 | 向量相似度可作为 function_score 的评分函数 |

典型应用场景


  • 语义搜索:文本通过 Embedding 模型转为向量,按语义相似度检索
  • RAG 检索增强生成:为大语言模型提供知识库检索能力
  • 推荐系统:用户/商品特征向量的相似推荐
  • 图像/多模态搜索:图像特征向量的相似检索
  • 去重与异常检测:通过向量距离判断内容相似度

    Embedding 服务


    在使用向量搜索前,先要准备一个 Embedding 模型,支持与 OpenAI API 兼容的 embedding 接口和 Ollama embedding 接口。本文使用阿里云上的 Embedding 模型进行演示。

    写入方法


    方法一:写入链路嵌入(推荐)


    在数据写入 Easysearch 时,通过 Ingest Pipeline 自动调用 Embedding 服务:

    应用写数据 → Easysearch → Ingest Pipeline → 调用 Embedding API → 写入向量字段

    优势是写入后即可搜索,无需维护外部向量化流程。需要确保集群应至少有一个节点拥有 ingest 角色。

    方法二:离线批处理


    在应用侧完成向量化,再将向量字段直接写入 Easysearch:

    原始数据 → 应用 → 调用模型 Embedding API → 写入 Easysearch(含向量字段)

    参考[文档](https://docs.infinilabs.com/ea ... earch/)。

    实战


    我们实战演示模式一,分为以下几个步骤:

    1. 建立带有向量字段的索引
    2. 创建对应的 Ingest Pipeline
    3. 写入数据到索引

      1. 建立带有向量字段的索引


      先建立一个带向量字段的索引,注意 dims 要与向量模型的输出匹配。

      plain<br /> PUT /my-index<br /> {<br /> "mappings": {<br /> "properties": {<br /> "text_vector": {<br /> "type": "knn_dense_float_vector",<br /> "knn": {<br /> "dims": 1024,<br /> "model": "lsh",<br /> "similarity": "cosine",<br /> "L": 99,<br /> "k": 1<br /> }<br /> }<br /> }<br /> }<br /> }<br /> <br />

      2. 创建对应的 Ingest Pipeline


      写入数据前先建立 Ingest Pipeline,注意 vendor 必须根据使用的模型来指定,比如本文使用的是阿里云 text-embedding-v4 模型,该模型提供了 OpenAI 格式的 API 接口,这里 vendor 我们就写 openai。

      plain<br /> PUT _ingest/pipeline/text-embedding-pipeline<br /> {<br /> "description": "用于生成文本嵌入向量的管道",<br /> "processors": [<br /> {<br /> "text_embedding": {<br /> "url": "<a href="https://dashscope.aliyuncs.com/compatible-mode/v1/embeddings"" rel="nofollow" target="_blank">https://dashscope.aliyuncs.com ... ot%3B</a>,<br /> "vendor": "openai",<br /> "api_key": "xxxxxx",<br /> "text_field": "input_text",<br /> "vector_field": "text_vector",<br /> "model_id": "text-embedding-v4",<br /> "dims": 1024,<br /> "ignore_missing": false,<br /> "ignore_failure": false<br /> }<br /> }<br /> ]<br /> }<br /> <br />

      text_field:指定原始文本字段,Pipeline 会将该字段的内容转换成向量。

      vector_field:指定向量存储的字段,保存上面转换的向量。

      3. 写入数据


      plain<br /> POST /_bulk?pipeline=text-embedding-pipeline&pretty<br /> {"index": {"_index": "my-index", "_id": "1"}}<br /> {"input_text": "苹果发布了新款iPhone 15 Pro手机,搭载A17芯片"}<br /> {"index": {"_index": "my-index", "_id": "2"}}<br /> {"input_text": "特斯拉宣布将在上海建第二座超级工厂"}<br /> {"index": {"_index": "my-index", "_id": "3"}}<br /> {"input_text": "今天天气真好,阳光明媚适合去公园散步"}<br /> {"index": {"_index": "my-index", "_id": "4"}}<br /> {"input_text": "程序员用Python写了一个自动化数据清洗脚本"}<br /> {"index": {"_index": "my-index", "_id": "5"}}<br /> {"input_text": "故宫博物院推出了夏季特展,展出珍贵文物"}<br /> {"index": {"_index": "my-index", "_id": "6"}}<br /> {"input_text": "小明每天坚持跑步五公里,身体越来越健康"}<br /> {"index": {"_index": "my-index", "_id": "7"}}<br /> {"input_text": "人工智能大模型在自然语言处理领域取得突破"}<br /> {"index": {"_index": "my-index", "_id": "8"}}<br /> {"input_text": "这家咖啡店的拿铁口感丝滑,推荐给咖啡爱好者"}<br /> {"index": {"_index": "my-index", "_id": "9"}}<br /> {"input_text": "量子计算机有望在药物研发中发挥重要作用"}<br /> {"index": {"_index": "my-index", "_id": "10"}}<br /> {"input_text": "周末和朋友一起去爬山,山顶的风景美极了"}<br />

      ![](https://infinilabs.cn/img/blog ... /1.png)

      4. 检查数据


      搜索索引数据,看看是否成功转换成了向量。可以看到原始数据保存在 input_text 字段中,其向量保存到了 text_vector。

      ![](https://infinilabs.cn/img/blog ... /2.png)

      OK,下一步我们看看怎么方便地实现向量搜索。
      ![](https://infinilabs.cn/img/blog ... gf.png)

      ---

      关于 Easysearch


      ![](https://infinilabs.cn/img/blog ... v2.png)

      INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。

      官网文档:<https://docs.infinilabs.com/easysearch>;

      ---

      相关文章:

  • [Easysearch 向量搜索指南](https://docs.infinilabs.com/ea ... earch/)