mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-07-25 09:53:29 +08:00
fix: stabilize knowledge compilation navigation updates (#17345)
This commit is contained in:
@@ -1135,6 +1135,9 @@ async def rerun_agent(tenant_id):
|
||||
if 0 < doc["progress"] < 1:
|
||||
return get_data_error_result(message=f"`{doc['name']}` is processing...")
|
||||
|
||||
from rag.advanced_rag.knowlege_compile.dataset_nav import remove_dataset_nav_doc_sync
|
||||
|
||||
remove_dataset_nav_doc_sync(tenant_id, doc["kb_id"], doc["id"])
|
||||
if settings.docStoreConn.index_exist(search.index_name(tenant_id), doc["kb_id"]):
|
||||
settings.docStoreConn.delete({"doc_id": doc["id"]}, search.index_name(tenant_id), doc["kb_id"])
|
||||
doc["progress_msg"] = ""
|
||||
|
||||
@@ -1470,6 +1470,9 @@ def _run_sync(user_id: str, req):
|
||||
DocumentService.update_by_id(doc_id, info)
|
||||
if req.get("delete", False):
|
||||
TaskService.filter_delete([Task.doc_id == doc_id])
|
||||
from rag.advanced_rag.knowlege_compile.dataset_nav import remove_dataset_nav_doc_sync
|
||||
|
||||
remove_dataset_nav_doc_sync(doc_tenant_id, doc.kb_id, doc.id)
|
||||
if settings.docStoreConn.index_exist(search.index_name(doc_tenant_id), doc.kb_id):
|
||||
settings.docStoreConn.delete({"doc_id": doc_id}, search.index_name(doc_tenant_id), doc.kb_id)
|
||||
|
||||
@@ -1580,6 +1583,9 @@ async def parse_documents(tenant_id, dataset_id):
|
||||
|
||||
DocumentService.update_by_id(doc_id, info)
|
||||
TaskService.filter_delete([Task.doc_id == doc_id])
|
||||
from rag.advanced_rag.knowlege_compile.dataset_nav import remove_dataset_nav_doc_sync
|
||||
|
||||
remove_dataset_nav_doc_sync(tenant_id, doc.kb_id, doc.id)
|
||||
if settings.docStoreConn.index_exist(search.index_name(tenant_id), doc.kb_id):
|
||||
settings.docStoreConn.delete({"doc_id": doc_id}, search.index_name(tenant_id), doc.kb_id)
|
||||
|
||||
|
||||
@@ -2452,7 +2452,10 @@ def _nav_item(row: dict) -> dict:
|
||||
payload = json.loads(row.get("content_with_weight") or "{}")
|
||||
except Exception:
|
||||
payload = {}
|
||||
is_cluster = (row.get("type_kwd") or payload.get("type")) == "nav_cluster"
|
||||
row_type = row.get("type_kwd")
|
||||
if isinstance(row_type, (list, tuple, set)):
|
||||
row_type = next(iter(row_type), None)
|
||||
is_cluster = (row_type or payload.get("type")) == "nav_cluster"
|
||||
return {
|
||||
"name": row.get("name") or "",
|
||||
"description": payload.get("description") or "",
|
||||
@@ -2551,7 +2554,8 @@ async def delete_nav(dataset_id: str, tenant_id: str):
|
||||
index_nm, _ = pack
|
||||
|
||||
try:
|
||||
deleted = settings.docStoreConn.delete(
|
||||
deleted = await thread_pool_exec(
|
||||
settings.docStoreConn.delete,
|
||||
{"compile_kwd": [_NAV_COMPILE_KWD]},
|
||||
index_nm,
|
||||
dataset_id,
|
||||
@@ -2592,16 +2596,17 @@ async def delete_nav_node(dataset_id: str, tenant_id: str, name: str):
|
||||
if not frontier:
|
||||
break
|
||||
try:
|
||||
res = settings.docStoreConn.search(
|
||||
select_fields=["name"],
|
||||
highlight_fields=[],
|
||||
condition={"compile_kwd": [_NAV_COMPILE_KWD], "parent_kwd": frontier},
|
||||
match_expressions=[],
|
||||
order_by=OrderByExpr(),
|
||||
offset=0,
|
||||
limit=10000,
|
||||
index_names=index_nm,
|
||||
knowledgebase_ids=[dataset_id],
|
||||
res = await thread_pool_exec(
|
||||
settings.docStoreConn.search,
|
||||
["name"],
|
||||
[],
|
||||
{"compile_kwd": [_NAV_COMPILE_KWD], "parent_kwd": frontier},
|
||||
[],
|
||||
OrderByExpr(),
|
||||
0,
|
||||
10000,
|
||||
index_nm,
|
||||
[dataset_id],
|
||||
)
|
||||
rows = settings.docStoreConn.get_fields(res, ["name"]) or {}
|
||||
except Exception:
|
||||
@@ -2616,7 +2621,8 @@ async def delete_nav_node(dataset_id: str, tenant_id: str, name: str):
|
||||
frontier = nxt
|
||||
|
||||
try:
|
||||
deleted = settings.docStoreConn.delete(
|
||||
deleted = await thread_pool_exec(
|
||||
settings.docStoreConn.delete,
|
||||
{"compile_kwd": [_NAV_COMPILE_KWD], "name": list(names)},
|
||||
index_nm,
|
||||
dataset_id,
|
||||
|
||||
@@ -492,6 +492,20 @@ class DocumentService(CommonService):
|
||||
except Exception as e:
|
||||
logging.warning(f"Failed to delete thumbnail for document {doc.id}: {e}")
|
||||
|
||||
# Prune this doc's line from the KB's tree-kind navigation before the
|
||||
# broad doc_id delete below removes the nav_doc row needed to locate
|
||||
# and update its parent cluster.
|
||||
try:
|
||||
from rag.advanced_rag.knowlege_compile.dataset_nav import (
|
||||
remove_dataset_nav_doc_sync,
|
||||
)
|
||||
|
||||
remove_dataset_nav_doc_sync(tenant_id, doc.kb_id, doc.id)
|
||||
except Exception as e:
|
||||
logging.warning(
|
||||
f"Failed to prune dataset_nav for document {doc.id}: {e}",
|
||||
)
|
||||
|
||||
# Delete chunks from doc store - this is critical, log errors
|
||||
try:
|
||||
settings.docStoreConn.delete({"doc_id": doc.id}, chunk_index_name, doc.kb_id)
|
||||
@@ -507,20 +521,6 @@ class DocumentService(CommonService):
|
||||
except Exception as e:
|
||||
logging.warning(f"Failed to clean up artifact products for document {doc.id}: {e}")
|
||||
|
||||
# Prune this doc's line from the KB's tree-kind navigation
|
||||
# markdown (best-effort — the markdown is a downstream artifact,
|
||||
# and failure here must not block the document delete).
|
||||
try:
|
||||
from rag.advanced_rag.knowlege_compile.dataset_nav import (
|
||||
remove_dataset_nav_doc_sync,
|
||||
)
|
||||
|
||||
remove_dataset_nav_doc_sync(tenant_id, doc.kb_id, doc.id)
|
||||
except Exception as e:
|
||||
logging.warning(
|
||||
f"Failed to prune dataset_nav for document {doc.id}: {e}",
|
||||
)
|
||||
|
||||
# Delete document metadata (non-critical, log and continue)
|
||||
try:
|
||||
DocMetadataService.delete_document_metadata(doc.id, doc.kb_id, tenant_id)
|
||||
|
||||
Reference in New Issue
Block a user