Sfoglia il codice sorgente

fix: move tags filtering to application layer (Milvus doesn't support JSON key existence check)

guantao 3 ore fa
parent
commit
d3de6da4a8
1 ha cambiato i file con 16 aggiunte e 9 eliminazioni
  1. 16 9
      knowhub/server.py

+ 16 - 9
knowhub/server.py

@@ -729,7 +729,7 @@ def list_knowledge(
 ):
     """列出知识(支持后端筛选)"""
     try:
-        # 构建过滤表达式
+        # 构建过滤表达式(不包含 tags,因为 Milvus 不支持 JSON key 存在性检查)
         filters = []
 
         # types 支持多个,用 AND 连接(交集:必须同时包含所有选中的type)
@@ -744,21 +744,28 @@ def list_knowledge(
         if 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 != ""'
 
-        # 查询 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]
 
+        # 在应用层进行 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)}
 
     except Exception as e: