|
@@ -729,7 +729,7 @@ def list_knowledge(
|
|
|
):
|
|
):
|
|
|
"""列出知识(支持后端筛选)"""
|
|
"""列出知识(支持后端筛选)"""
|
|
|
try:
|
|
try:
|
|
|
- # 构建过滤表达式
|
|
|
|
|
|
|
+ # 构建过滤表达式(不包含 tags,因为 Milvus 不支持 JSON key 存在性检查)
|
|
|
filters = []
|
|
filters = []
|
|
|
|
|
|
|
|
# types 支持多个,用 AND 连接(交集:必须同时包含所有选中的type)
|
|
# types 支持多个,用 AND 连接(交集:必须同时包含所有选中的type)
|
|
@@ -744,21 +744,28 @@ def list_knowledge(
|
|
|
if owner:
|
|
if owner:
|
|
|
filters.append(f'owner like "%{owner}%"')
|
|
filters.append(f'owner like "%{owner}%"')
|
|
|
|
|
|
|
|
- # tags 支持多个,用 AND 连接(交集:必须同时包含所有选中的tag)
|
|
|
|
|
- if tags:
|
|
|
|
|
- tag_list = [t.strip() for t in tags.split(',') if t.strip()]
|
|
|
|
|
- for t in tag_list:
|
|
|
|
|
- filters.append(f'json_contains(tags, \'"{t}"\')')
|
|
|
|
|
-
|
|
|
|
|
# 如果没有过滤条件,查询所有
|
|
# 如果没有过滤条件,查询所有
|
|
|
filter_expr = ' and '.join(filters) if filters else 'id != ""'
|
|
filter_expr = ' and '.join(filters) if filters else 'id != ""'
|
|
|
|
|
|
|
|
- # 查询 Milvus
|
|
|
|
|
- results = milvus_store.query(filter_expr, limit=limit)
|
|
|
|
|
|
|
+ # 查询 Milvus(使用更大的 limit 以便后续过滤)
|
|
|
|
|
+ query_limit = limit * 10 if tags else limit
|
|
|
|
|
+ results = milvus_store.query(filter_expr, limit=query_limit)
|
|
|
|
|
|
|
|
# 转换为可序列化的格式
|
|
# 转换为可序列化的格式
|
|
|
serialized_results = [serialize_milvus_result(r) for r in results]
|
|
serialized_results = [serialize_milvus_result(r) for r in results]
|
|
|
|
|
|
|
|
|
|
+ # 在应用层进行 tags 过滤(因为 Milvus 不支持 JSON key 存在性检查)
|
|
|
|
|
+ if tags:
|
|
|
|
|
+ tag_list = [t.strip() for t in tags.split(',') if t.strip()]
|
|
|
|
|
+ filtered_results = []
|
|
|
|
|
+ for item in serialized_results:
|
|
|
|
|
+ tags_dict = item.get("tags", {})
|
|
|
|
|
+ if isinstance(tags_dict, dict):
|
|
|
|
|
+ # 检查是否包含所有指定的 tag keys
|
|
|
|
|
+ if all(tag_key in tags_dict for tag_key in tag_list):
|
|
|
|
|
+ filtered_results.append(item)
|
|
|
|
|
+ serialized_results = filtered_results[:limit]
|
|
|
|
|
+
|
|
|
return {"results": serialized_results, "count": len(serialized_results)}
|
|
return {"results": serialized_results, "count": len(serialized_results)}
|
|
|
|
|
|
|
|
except Exception as e:
|
|
except Exception as e:
|