You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过ID从PyMilvus中检索文档?技术实现求助

如何通过ID从Milvus中检索对应文档?

现有操作与问题

我已通过以下代码连接Milvus并选中集合:

connections.connect("default", host=cfg.db.connection.host, port=cfg.db.connection.port)
collection = Collection(name="ibss")

通过向量搜索能获取包含ID的结果,但entity始终为空:

query_vector = SentenceTransformerEmbeddings().embed_query(SOME_TEXT_HERE)
search_params = {
    "metric_type": "L2",
    "params": {"nprobe": 10},
}

results = collection.search(data=[query_vector], param=search_params, anns_field = "vector", limit = 3, output_fields = [])

# 想通过ID获取对应文本以便删除
for hits in results:
    for hit in hits: 
        print(hit)
        break

输出示例:

id: 445499747977925765, distance: 0.24354277551174164, entity: {}

尝试通过ID检索文档时返回空结果:

entity_id = 445499747977925765

# 定义过滤条件
filter_expr = f"id == {entity_id}"

# 带过滤条件搜索
a = collection.search(
    data=[],
    anns_field="",
    param={"filter": filter_expr},
    limit=1
)

数据导入方式

我使用LangChain的Milvus.from_documents导入数据:

from langchain.vectorstores import Milvus
vector_db = Milvus.from_documents(
    deduplicated_documents,
    SentenceTransformerEmbeddings(),
    connection_args={"host": cfg.db.connection.host, "port": cfg.db.connection.port},
    collection_name=cfg_data.target.collection.name,
    drop_old=cfg_data.target.collection.renew
)

解决方案

1. 明确LangChain创建的Milvus集合字段

LangChain的Milvus.from_documents默认会创建以下字段:

  • id:主键(默认int64类型)
  • vector:向量字段
  • text:存储文档内容的字段
  • 额外元数据字段(取决于你的Document对象结构)

2. 正确通过ID检索的两种方法

方法一:使用collection.query()(推荐)

search()是向量检索接口,必须传入向量数据;按主键ID查询属于精准匹配,用**query()**更合适:

entity_id = 445499747977925765
# 指定要返回的字段,比如text和自定义元数据字段
result = collection.query(
    expr=f"id == {entity_id}",
    output_fields=["text"]
)
print(result)

方法二:用search()实现(不推荐,无必要)

必须传入合法向量(可生成同维度随机向量),同时指定anns_field和过滤条件:

import numpy as np
entity_id = 445499747977925765
filter_expr = f"id == {entity_id}"
# 生成和你的向量维度一致的随机向量(示例为768维)
dummy_vector = np.random.rand(768).tolist()

results = collection.search(
    data=[dummy_vector],
    anns_field="vector",
    param={"metric_type": "L2", "params": {"nprobe": 10}, "filter": filter_expr},
    limit=1,
    output_fields=["text"]
)

3. 解决entity为空的问题

在search()时需指定实际存在的output_fields,比如:

results = collection.search(
    data=[query_vector],
    param=search_params,
    anns_field="vector",
    limit=3,
    output_fields=["text"]  # 这里填写需要返回的字段名
)

内容的提问来源于stack exchange,提问作者Areza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 16:25:10