INFINI Easysearch 向量搜索实战(一)
向量搜索 • INFINI Labs 小助手 发表了文章 • 0 个评论 • 7 次浏览 • 21 分钟前

[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/)。
实战
我们实战演示模式一,分为以下几个步骤:
- 建立带有向量字段的索引
- 创建对应的 Ingest Pipeline
- 写入数据到索引
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 />

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

OK,下一步我们看看怎么方便地实现向量搜索。

---
关于 Easysearch

INFINI Easysearch 是一款分布式搜索引擎,支持结构化和非结构化的数据检索、全文检索、向量检索、空间地理位置信息检索、组合查询、多语种支持、语义分析和聚合分析等多种功能。
Easysearch 基于 Lucene 构建,紧跟 Lucene 最新版本持续迭代更新,采用商用友好协议,企业可自由部署、二次开发和商业化,无协议合规风险。
Easysearch 致力于为企业提供轻量、安全、自主可控的搜索平台,不断完善产品能力,满足更多企业级需求。
官网:<https://easysearch.cn>
---
相关文章:
- 建立带有向量字段的索引
- [Easysearch 向量搜索指南](https://docs.infinilabs.com/ea ... earch/)
- [INFINI Easysearch 向量搜索实战(二)](https://infinilabs.cn/blog/202 ... rch-2/)
INFINI Easysearch 向量搜索实战(二)
向量搜索 • INFINI Labs 小助手 发表了文章 • 0 个评论 • 6 次浏览 • 17 分钟前

[上回](https://infinilabs.cn/blog/202 ... rch-1/) 我们通过 Ingest Pipeline 把数据在写入 [Easysearch](https://easysearch.cn) 的过程中自动转换成了向量,这次我们通过 Search Pipeline 实现查询时将查询内容转换成向量并进行查询。
Embedding 服务
这里要保持与写入时使用的模型一致。
实战
我们实战演示分为以下几个步骤:
- 建立 Search Pipeline
- 设置索引默认 Pipeline
- 数据查询
建立 Search Pipeline
plain<br /> PUT /_search/pipeline/default_model_pipeline<br /> {<br /> "rewrite_processors": [<br /> {<br /> "semantic_query_enricher" : {<br /> "description": "Sets the default embedding model",<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": "<api_key>",<br /> "default_model_id": "text-embedding-v4",<br /> "vector_field_model_id": {<br /> "text_vector": "text-embedding-v4"<br /> }<br /> }<br /> }<br /> ]<br /> }<br />

设置索引默认 Pipeline
为了方便查询,不用每次查询都指定 Pipeline,我们设置默认值。
plain<br /> PUT /my-index/_settings<br /> {<br /> "index.search.default_pipeline" : "default_model_pipeline"<br /> }<br />

数据查询
使用上次写入的数据进行查询测试,但不直接查询原来的文本内容。
plain<br /> GET /my-index/_search<br /> {<br /> "_source": "input_text",<br /> "query": {<br /> "semantic": {<br /> "text_vector": {<br /> "query_text": "非常先进高级的生产车间",<br /> "candidates": 100,<br /> "query_strategy": "LSH_COSINE"<br /> }<br /> }<br /> }<br /> }<br />
参数解释请查看[文档](https://docs.infinilabs.com/ea ... dding/)。

OK,从上面可以看到,我们没有直接搜索原文本中的内容或关键字,但还是通过文本的语义检索到了相关内容。

---
关于 Easysearch

INFINI Easysearch 是一款分布式搜索引擎,支持结构化和非结构化的数据检索、全文检索、向量检索、空间地理位置信息检索、组合查询、多语种支持、语义分析和聚合分析等多种功能。
Easysearch 基于 Lucene 构建,紧跟 Lucene 最新版本持续迭代更新,采用商用友好协议,企业可自由部署、二次开发和商业化,无协议合规风险。
Easysearch 致力于为企业提供轻量、安全、自主可控的搜索平台,不断完善产品能力,满足更多企业级需求。
官网:<https://easysearch.cn>
---
相关文章:
- [INFINI Easysearch 向量搜索实战(一)](https://infinilabs.cn/blog/202 ... rch-1/)
- [Easysearch 向量搜索指南](https://docs.infinilabs.com/ea ... earch/)
- [INFINI Easysearch 向量搜索实战(一)](https://infinilabs.cn/blog/202 ... rch-1/)


