fix: FTP pipeline MeSH 打标链 — 修复 _upsert_article_impl 缺少 tag_article() 调用

FTP 增量更新写入 mesh_headings JSONB 后未调用 tag_article(),导致
GlobalLiteratureTag 无关联记录,[MH]/[MAJR] 搜索返回空。新增 tag_ids
数组维护 + 标签缓存失效。
This commit is contained in:
34047007@qq.com
2026-07-27 16:16:17 +08:00
parent 91748bf668
commit c791c06096
3 changed files with 33 additions and 3 deletions
+2 -2
View File
@@ -1468,7 +1468,7 @@ async def retag_tags(
此接口仅用于回填管道上线前已存在的文献。
"""
import logging
from app.services.pubmed_api import _tag_article
from app.services.tag_service import tag_article
logger = logging.getLogger(__name__)
@@ -1494,7 +1494,7 @@ async def retag_tags(
mh = lit.mesh_headings
if not mh or (isinstance(mh, list) and len(mh) == 0):
continue
n = await _tag_article(db, lit.id, mh)
n = await tag_article(db, lit.id, mh)
if n:
tagged_count += 1
tags_added += n
+16 -1
View File
@@ -6,9 +6,10 @@
import uuid
import logging
from sqlalchemy import select
from sqlalchemy import func, select, update as sql_update
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.cache import cache as _redis_cache
from app.models.literature import GlobalTag, GlobalLiteratureTag
logger = logging.getLogger(__name__)
@@ -78,6 +79,20 @@ async def tag_article(db: AsyncSession, lit_id: uuid.UUID,
tag.article_count += 1
count += 1
if count > 0:
# 维护反范式 tag_ids 数组
new_ids = [tag.id for tag in matched if tag.id not in existing_tag_ids]
if new_ids:
from sqlalchemy import update as sql_update
from app.models.literature import GlobalLiterature
stmt = (
sql_update(GlobalLiterature)
.where(GlobalLiterature.id == lit_id)
.values(tag_ids=func.array_cat(func.coalesce(GlobalLiterature.tag_ids, "{}"), new_ids))
)
await db.execute(stmt)
await _redis_cache.delete(f"tags:{lit_id}")
return count
+15
View File
@@ -16,6 +16,7 @@ from app.compat import UTC
from app.db import async_session
from app.models.literature import GlobalLiterature
from app.services.journal_utils import ensure_journal_async
from app.services.tag_service import tag_article
# DOI 正则:从 PDF 全文提取
DOI_PATTERN = re.compile(r'10\.\d{4,9}/[-._;()/:A-Za-z0-9]+')
@@ -185,6 +186,12 @@ async def _upsert_article_impl(article_data: dict, db: AsyncSession) -> bool:
lit.doi = article_data["doi"]
lit.mesh_headings = article_data.get("mesh_headings", lit.mesh_headings)
lit.updated_at = datetime.now(UTC)
mh = article_data.get("mesh_headings", [])
if mh:
try:
await tag_article(db, lit.id, mh)
except Exception:
pass
await db.commit()
return False
else:
@@ -194,5 +201,13 @@ async def _upsert_article_impl(article_data: dict, db: AsyncSession) -> bool:
await ensure_journal_async(db, article_data.get("journal_issn"), article_data.get("journal"))
except Exception:
pass
# 需要 flush 才能拿到 lit.id
try:
await db.flush()
mh = article_data.get("mesh_headings", [])
if mh:
await tag_article(db, lit.id, mh)
except Exception:
pass
await db.commit()
return True