fix: 素材回退逻辑支持模糊匹配二级分类
- 新增 broll_category.get_by_name_like_and_level() 模糊匹配方法 - _try_fallback_to_parent 增加三级降级策略: 1. 精确匹配 2. 模糊匹配 LIKE %parent_name%(兼容'电路施工'→'电路施工镜') 3. 自动补后缀'镜'/'阶段'再精确匹配 - 解决 scene 中 parent_name 与数据库二级分类 name 不一致导致回退失败的问题
This commit is contained in:
@@ -57,6 +57,19 @@ class BrollCategoryCRUD(CRUDBase[BrollCategory]):
|
|||||||
)
|
)
|
||||||
return list(result.scalars().all())
|
return list(result.scalars().all())
|
||||||
|
|
||||||
|
async def get_by_name_like_and_level(
|
||||||
|
self, db: AsyncSession, *, name: str, level: int
|
||||||
|
) -> BrollCategory | None:
|
||||||
|
"""根据名称模糊匹配和层级获取启用的分类(LIKE %name%)"""
|
||||||
|
result = await db.execute(
|
||||||
|
select(BrollCategory).where(
|
||||||
|
BrollCategory.name.like(f"%{name}%"),
|
||||||
|
BrollCategory.level == level,
|
||||||
|
BrollCategory.status == "active",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return result.scalar_one_or_none()
|
||||||
|
|
||||||
|
|
||||||
# 导出实例
|
# 导出实例
|
||||||
broll_category = BrollCategoryCRUD()
|
broll_category = BrollCategoryCRUD()
|
||||||
|
|||||||
@@ -69,6 +69,11 @@ async def _try_fallback_to_parent(
|
|||||||
- 若 scene 含 '-',取后半部分作为 parent_name(如 '电路施工-电路施工' -> '电路施工')
|
- 若 scene 含 '-',取后半部分作为 parent_name(如 '电路施工-电路施工' -> '电路施工')
|
||||||
- 若不含 '-',直接以整个 scene 作为 parent_name
|
- 若不含 '-',直接以整个 scene 作为 parent_name
|
||||||
|
|
||||||
|
匹配策略(逐级降级):
|
||||||
|
1. 精确匹配 level=2 分类 name
|
||||||
|
2. 模糊匹配(LIKE %parent_name%),兼容 "电路施工" → "电路施工镜"
|
||||||
|
3. 去掉常见后缀(镜、阶段等)再精确匹配
|
||||||
|
|
||||||
返回:
|
返回:
|
||||||
随机选中的一个 level=3 子分类,或 None
|
随机选中的一个 level=3 子分类,或 None
|
||||||
"""
|
"""
|
||||||
@@ -77,9 +82,28 @@ async def _try_fallback_to_parent(
|
|||||||
else:
|
else:
|
||||||
parent_name = normalized_scene
|
parent_name = normalized_scene
|
||||||
|
|
||||||
|
# 1. 精确匹配
|
||||||
parent = await broll_category.get_by_name_and_level(
|
parent = await broll_category.get_by_name_and_level(
|
||||||
db, name=parent_name, level=2
|
db, name=parent_name, level=2
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# 2. 模糊匹配(兼容 "电路施工" → "电路施工镜")
|
||||||
|
if parent is None:
|
||||||
|
parent = await broll_category.get_by_name_like_and_level(
|
||||||
|
db, name=parent_name, level=2
|
||||||
|
)
|
||||||
|
|
||||||
|
# 3. 去掉常见后缀再试
|
||||||
|
if parent is None:
|
||||||
|
for suffix in ("镜", "阶段"):
|
||||||
|
if not parent_name.endswith(suffix):
|
||||||
|
candidate = parent_name + suffix
|
||||||
|
parent = await broll_category.get_by_name_and_level(
|
||||||
|
db, name=candidate, level=2
|
||||||
|
)
|
||||||
|
if parent:
|
||||||
|
break
|
||||||
|
|
||||||
if parent is None:
|
if parent is None:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user