mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-02-04 17:45:07 +08:00
Fix "metadata table not exists" (#12949)
### What problem does this PR solve? Fix "metadata table not exists" when updating a meta data. ### Type of change - [x] Bug Fix (non-breaking change which fixes an issue)
This commit is contained in:
@ -22,6 +22,7 @@ This is the SOLE source of truth for document metadata - MySQL meta_fields colum
|
||||
|
||||
import json
|
||||
import logging
|
||||
import re
|
||||
from copy import deepcopy
|
||||
from typing import Dict, List, Optional
|
||||
|
||||
@ -158,15 +159,24 @@ class DocMetadataService:
|
||||
limit: Max results to return
|
||||
|
||||
Returns:
|
||||
Search results from ES/Infinity
|
||||
Search results from ES/Infinity, or empty list if index doesn't exist
|
||||
"""
|
||||
kb = Knowledgebase.get_by_id(kb_id)
|
||||
if not kb:
|
||||
return None
|
||||
return []
|
||||
|
||||
tenant_id = kb.tenant_id
|
||||
index_name = cls._get_doc_meta_index_name(tenant_id)
|
||||
|
||||
# Check if metadata index exists, create if it doesn't
|
||||
if not settings.docStoreConn.index_exist(index_name, ""):
|
||||
logging.debug(f"Metadata index {index_name} does not exist, creating it")
|
||||
result = settings.docStoreConn.create_doc_meta_idx(index_name)
|
||||
if result is False:
|
||||
logging.error(f"Failed to create metadata index {index_name}")
|
||||
return []
|
||||
logging.debug(f"Successfully created metadata index {index_name}")
|
||||
|
||||
if condition is None:
|
||||
condition = {"kb_id": kb_id}
|
||||
|
||||
@ -199,8 +209,6 @@ class DocMetadataService:
|
||||
Returns:
|
||||
Processed metadata with split values
|
||||
"""
|
||||
import re
|
||||
|
||||
if not meta_fields or not isinstance(meta_fields, dict):
|
||||
return meta_fields
|
||||
|
||||
@ -288,6 +296,9 @@ class DocMetadataService:
|
||||
# Both ES and Infinity now use per-tenant metadata tables
|
||||
result = settings.docStoreConn.create_doc_meta_idx(index_name)
|
||||
logging.debug(f"Table creation result: {result}")
|
||||
if result is False:
|
||||
logging.error(f"Failed to create metadata table {index_name}")
|
||||
return False
|
||||
else:
|
||||
logging.debug(f"Metadata table already exists: {index_name}")
|
||||
|
||||
@ -800,11 +811,17 @@ class DocMetadataService:
|
||||
Dictionary with metadata field statistics in format:
|
||||
{
|
||||
"field_name": {
|
||||
"type": "string" | "number" | "list",
|
||||
"type": "string" | "number" | "list" | "time",
|
||||
"values": [("value1", count1), ("value2", count2), ...] # sorted by count desc
|
||||
}
|
||||
}
|
||||
"""
|
||||
def _is_time_string(value: str) -> bool:
|
||||
"""Check if a string value is an ISO 8601 datetime (e.g., '2026-02-03T00:00:00')."""
|
||||
if not isinstance(value, str):
|
||||
return False
|
||||
return bool(re.match(r'^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$', value))
|
||||
|
||||
def _meta_value_type(value):
|
||||
"""Determine the type of a metadata value."""
|
||||
if value is None:
|
||||
@ -815,6 +832,8 @@ class DocMetadataService:
|
||||
return "string"
|
||||
if isinstance(value, (int, float)):
|
||||
return "number"
|
||||
if isinstance(value, str) and _is_time_string(value):
|
||||
return "time"
|
||||
return "string"
|
||||
|
||||
try:
|
||||
@ -850,7 +869,7 @@ class DocMetadataService:
|
||||
# Aggregate value counts
|
||||
values = v if isinstance(v, list) else [v]
|
||||
for vv in values:
|
||||
if not vv:
|
||||
if vv is None:
|
||||
continue
|
||||
sv = str(vv)
|
||||
if k not in summary:
|
||||
|
||||
Reference in New Issue
Block a user