Qdrant中Docs集合提取文档标题列表返回空,如何解决?
Qdrant提取所有文档标题列表的解决方法
你的代码返回空值的核心问题是误用了MatchText的匹配规则:MatchText是针对全文索引字段的文本检索,*在这里不是通配符,会被当作普通字符处理,自然匹配不到任何内容。
要提取所有文档标题,你可以按以下两种方式实现:
方式1:直接获取所有点的标题(假设所有点都有meta.title)
不需要额外过滤,直接通过scroll遍历所有点,提取元数据中的标题即可:
from qdrant_client import QdrantClient, models client = QdrantClient(url="http://localhost:6333") # 初始化scroll的游标 next_page_offset = None all_titles = [] while True: points, next_page_offset = client.scroll( collection_name="Docs", limit=100, # 每次获取的点数,可根据需求调整 offset=next_page_offset, with_payload=True, # 必须开启才能获取元数据 with_vectors=False # 不需要向量,关闭节省资源 ) # 提取当前页的标题 for point in points: title = point.payload.get("meta", {}).get("title") if title: all_titles.append(title) # 没有下一页时退出循环 if next_page_offset is None: break print(all_titles)
方式2:只获取存在meta.title的点的标题
如果集合中存在部分点没有meta.title,可以用ExistsCondition过滤出包含该字段的点:
from qdrant_client import QdrantClient, models client = QdrantClient(url="http://localhost:6333") next_page_offset = None all_titles = [] while True: points, next_page_offset = client.scroll( collection_name="Docs", limit=100, offset=next_page_offset, scroll_filter=models.Filter( must=[ models.FieldCondition( key="meta.title", match=models.MatchExists(exists=True) ) ] ), with_payload=True, with_vectors=False ) for point in points: all_titles.append(point.payload["meta"]["title"]) if next_page_offset is None: break print(all_titles)
关键注意事项
- 必须设置
with_payload=True,否则无法获取点的元数据(包括标题)。 scroll方法需要分页遍历,因为单次获取的点数有限制,通过next_page_offset循环直到没有下一页。- 避免使用
MatchText做通配符匹配,Qdrant中针对字段存在性判断用MatchExists,模糊匹配可用MatchWildcard(但需注意字段是否为关键字段)。
内容的提问来源于stack exchange,提问作者HMadadi
相关产品推荐
相关产品推荐

