探索 Milvus 混合搜索检索器:实现高效向量搜索

探索 Milvus 混合搜索检索器:实现高效向量搜索

引言

在现代数据驱动的世界中,快速且精确地检索信息的能力至关重要。Milvus 是一个开源的向量数据库,专为嵌入相似性搜索和 AI 应用而设计。本篇文章将引导您了解 Milvus 的混合搜索检索器——融合了密集和稀疏向量搜索的优势。通过本文,您将学会如何使用 Milvus 来实现高效的数据检索。

主要内容

1. Milvus 混合搜索概述

Milvus 的混合搜索功能结合了密集向量(通过神经网络生成)和稀疏向量(通过词频-逆文档频率等算法生成)的搜索能力。这种方法不仅提高了搜索的精准度,还提升了检索的性能。

2. 基础配置

  • 安装依赖包

    %pip install --upgrade --quiet pymilvus[model] langchain-milvus langchain-openai
    
  • 初始化 Milvus 服务

    请参阅 Milvus 文档 来启动 Milvus 服务。启动后,指定连接 URI:

    CONNECTION_URI = "http://localhost:19530" # 使用API代理服务提高访问稳定性
    
  • 设置 OpenAI API 密钥

    获取 API 密钥并设置为环境变量。

    export OPENAI_API_KEY=<your_api_key>
    

3. 创建和使用 Milvus 集合

from langchain_milvus.retrievers import MilvusCollectionHybridSearchRetriever
from pymilvus import Collection, CollectionSchema, DataType, FieldSchema, connections

# 连接到 Milvus
connections.connect(uri=CONNECTION_URI)

# 定义领域和数据类型
fields = [
    FieldSchema(name="doc_id", dtype=DataType.VARCHAR, is_primary=True, auto_id=True),
    FieldSchema(name="dense_vector", dtype=DataType.FLOAT_VECTOR, dim=1536),
    FieldSchema(name="sparse_vector", dtype=DataType.SPARSE_FLOAT_VECTOR),
    FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=65535),
]

# 创建集合
schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
collection = Collection(name="IntroductionToTheNovels", schema=schema)

# 插入实体
entities = [
    {"dense_vector": [1.2, 0.2, ...], "sparse_vector": {0: 0.4, 2: 1.8}, "text": "Some text"},
    # 更多实体...
]
collection.insert(entities)
collection.load()

# 实例化检索器
retriever = MilvusCollectionHybridSearchRetriever(
    collection=collection,
    anns_fields=["dense_vector", "sparse_vector"],
    top_k=3,
    text_field="text",
)

# 使用检索器
results = retriever.invoke("查询文本")

常见问题和解决方案

  • 网络连接问题:由于某些地区的网络限制,开发者可能需要使用 API 代理服务来访问 Milvus 和 OpenAI API 。
  • 性能优化:增大批量插入的大小可以提高数据写入的效率。

总结和进一步学习资源

Milvus 的混合搜索检索器为开发者提供了一种灵活且强大的工具来处理大规模的非结构化数据搜索。通过结合密集和稀疏向量,Milvus 能够在多种应用场景下提供出色的搜索性能。

进一步学习资源

参考资料

  1. Milvus 官方文档
  2. Langchain Milvus 项目页面
  3. OpenAI API 使用文档

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

—END—

<think>好的,我现在需要帮助用户了解如何在Milvus实现混合检索并应用过滤条件。首先,我得回顾一下Milvus的相关知识,确保自己理解正确。混合检索通常指的是同时使用向量搜索和标量过滤,或者结合稠密向量和稀疏向量(比如BM25)的搜索方式。用户提到的过滤条件可能涉及标量字段的过滤。 根据提供的引用,特别是引用[3]和[4],Milvus内置了BM25算法,支持混合检索,并且可以在搜索时添加标量过滤条件。需要明确混合检索在Milvus中的两种常见情况:一种是向量搜索结合标量过滤,另一种是稠密向量与稀疏向量混合搜索。用户的问题可能同时涉及这两个方面,但需要具体分析。 接下来,我需要按照用户的要求分步骤解释实现方式。首先,确认数据准备阶段,包括定义集合结构,包含向量字段和标量字段。然后,在插入数据时,需要包含这些字段。接着,在搜索时,使用布尔表达式进行标量过滤,并指定混合搜索的参数,比如结合BM25和向量相似度。 需要注意不同Milvus版本可能有所差异,但根据引用[4],官方文档中的示例展示了如何加载集合、执行混合搜索,并应用过滤条件。可能还需要提到如何设置搜索参数,比如调整两者的权重,以及如何解析返回结果。 用户可能还关心实际应用的例子,比如在RAG系统中使用混合检索提升效果。需要确保步骤清晰,代码示例正确,并且符合用户提供的引用内容。同时,生成的相关问题需要与主题相关,帮助用户进一步探索。</think>### Milvus混合检索实现方式及过滤条件使用方法 #### 一、混合检索实现原理 Milvus混合检索主要包含两种形式: 1. **向量相似度+标量过滤**:在向量搜索基础上,通过布尔表达式筛选标量字段(如ID、分类标签等)[^4] 2. **稠密向量+稀疏向量混合搜索**:同时使用稠密向量(如BERT嵌入)和稀疏向量(BM25算法生成的词袋向量)进行联合检索[^3] #### 二、实现步骤 ##### 1. 数据准备阶段 ```python from pymilvus import CollectionSchema, FieldSchema, DataType # 定义字段(包含向量字段和标量字段) fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=1000), FieldSchema(name="category", dtype=DataType.INT64), FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=768), FieldSchema(name="sparse_vector", dtype=DataType.SPARSE_FLOAT_VECTOR) ] # 创建集合 schema = CollectionSchema(fields) collection = Collection("hybrid_collection", schema) ``` ##### 2. 数据插入 ```python data = [ [1, 2, 3], # ids ["文本内容1", "文本内容2", "文本内容3"], # contents [101, 102, 101], # categories [...], # 稠密向量数组 {...} # 稀疏向量字典(BM25自动生成) ] collection.insert(data) ``` ##### 3. 创建索引 ```python # 稠密向量索引 index_params = { "index_type": "IVF_FLAT", "metric_type": "L2", "params": {"nlist": 128} } collection.create_index("vector", index_params) # 稀疏向量索引自动创建(BM25) ``` ##### 4. 执行混合检索 ```python # 查询条件设置 search_params = { "metric_type": "L2", "params": {"nprobe": 10}, "anns_field": "vector", "sparse_params": { "analyzer": "milvus_bm25", # 使用内置分词器 "topk": 50 } } # 混合搜索请求 results = collection.search( data=[query_vector], # 查询向量 anns_field="vector", param=search_params, limit=10, expr="category == 101", # 标量过滤条件[^4] output_fields=["content", "category"], hybrid=True, rerank=rrf() # 结果重排序策略 ) ``` #### 三、过滤条件使用技巧 1. **布尔表达式**:支持`&&`, `||`, `==`, `>`, `<`等运算符 - 示例:`"(rating > 4) && (category in [101, 102])"`[^4] 2. **动态范围过滤**: ```python expr = f"timestamp >= {start_time} && timestamp <= {end_time}" ``` 3. **多条件组合**: ```python expr = "(user_type == 'VIP' && click_count > 10) || (is_recommended == true)" ``` 4. **性能优化**: - 为过滤字段建立标量索引 - 优先使用数值型过滤条件 - 避免全表扫描表达式(如`LIKE`模糊查询) #### 四、典型应用场景 1. **电商推荐**:`向量相似度(商品特征)+ 价格区间过滤` 2. **内容检索**:`BM25(关键词匹配)+ 用户画像向量相似度` 3. **时间序列分析**:`时序向量相似度 + 时间范围过滤`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值