如何通过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
相关产品推荐
相关产品推荐

