--- title: "INFINI Easysearch 向量搜索实战(一)" date: 2026-07-15 lastmod: 2026-07-15 description: "Easysearch提供先进的向量搜索功能,支持稠密向量和稀疏向量两种数据类型,集成多种索引模型和相似度算法,实现语义搜索、智能推荐等AI应用。通过Embedding服务将文本转换为向量,支持两种写入模式:写入链路嵌入(自动调用Embedding API)和离线批处理。实战演示包括创建带向量字段的索引、配置Ingest Pipeline实现自动向量化,以及数据写入和验证流程。该技术可应用于RAG、内容推荐、图像搜索等场景,有效挖掘数据价值。" tags: ["Easysearch"] summary: "Easysearch 提供了强大的向量搜索能力,打破传统关键词匹配的局限,实现真正的“懂你”的语义搜索。助力企业快速构建智能推荐、图像识别和内容理解等 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 提供了强大的向量搜索能力,打破传统关键词匹配的局限,实现真正的“懂你”的语义搜索。助力企业快速构建智能推荐、图像识别和内容理解等 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/easysearch/main/docs/features/vector-search/vector-search/)。 ## 实战 我们实战演示模式一,分为以下几个步骤: 1. 建立带有向量字段的索引 2. 创建对应的 Ingest Pipeline 3. 写入数据到索引 ## 1. 建立带有向量字段的索引 先建立一个带向量字段的索引,注意 dims 要与向量模型的输出匹配。 ```plain PUT /my-index { "mappings": { "properties": { "text_vector": { "type": "knn_dense_float_vector", "knn": { "dims": 1024, "model": "lsh", "similarity": "cosine", "L": 99, "k": 1 } } } } } ``` ## 2. 创建对应的 Ingest Pipeline 写入数据前先建立 Ingest Pipeline,注意 vendor 必须根据使用的模型来指定,比如本文使用的是阿里云 text-embedding-v4 模型,该模型提供了 OpenAI 格式的 API 接口,这里 vendor 我们就写 openai。 ```plain PUT _ingest/pipeline/text-embedding-pipeline { "description": "用于生成文本嵌入向量的管道", "processors": [ { "text_embedding": { "url": "https://dashscope.aliyuncs.com/compatible-mode/v1/embeddings", "vendor": "openai", "api_key": "xxxxxx", "text_field": "input_text", "vector_field": "text_vector", "model_id": "text-embedding-v4", "dims": 1024, "ignore_missing": false, "ignore_failure": false } } ] } ``` text_field:指定原始文本字段,Pipeline 会将该字段的内容转换成向量。 vector_field:指定向量存储的字段,保存上面转换的向量。 ## 3. 写入数据 ```plain POST /_bulk?pipeline=text-embedding-pipeline&pretty {"index": {"_index": "my-index", "_id": "1"}} {"input_text": "苹果发布了新款iPhone 15 Pro手机,搭载A17芯片"} {"index": {"_index": "my-index", "_id": "2"}} {"input_text": "特斯拉宣布将在上海建第二座超级工厂"} {"index": {"_index": "my-index", "_id": "3"}} {"input_text": "今天天气真好,阳光明媚适合去公园散步"} {"index": {"_index": "my-index", "_id": "4"}} {"input_text": "程序员用Python写了一个自动化数据清洗脚本"} {"index": {"_index": "my-index", "_id": "5"}} {"input_text": "故宫博物院推出了夏季特展,展出珍贵文物"} {"index": {"_index": "my-index", "_id": "6"}} {"input_text": "小明每天坚持跑步五公里,身体越来越健康"} {"index": {"_index": "my-index", "_id": "7"}} {"input_text": "人工智能大模型在自然语言处理领域取得突破"} {"index": {"_index": "my-index", "_id": "8"}} {"input_text": "这家咖啡店的拿铁口感丝滑,推荐给咖啡爱好者"} {"index": {"_index": "my-index", "_id": "9"}} {"input_text": "量子计算机有望在药物研发中发挥重要作用"} {"index": {"_index": "my-index", "_id": "10"}} {"input_text": "周末和朋友一起去爬山,山顶的风景美极了"} ``` {{% load-img "/img/blog/2026/easysearch-vector-search-1/1.png" "" %}} ## 4. 检查数据 搜索索引数据,看看是否成功转换成了向量。可以看到原始数据保存在 input_text 字段中,其向量保存到了 text_vector。 {{% load-img "/img/blog/2026/easysearch-vector-search-1/2.png" "" %}} OK,下一步我们看看怎么方便地实现向量搜索。 {{% load-img "/img/blog/banner/about_yangf.png" "" %}}