49 lines
1.3 KiB
Python
49 lines
1.3 KiB
Python
|
|
"""刷新 search_keywords(立即跑一次,不依赖 worker 03:00 调度)。
|
||
|
|
|
||
|
|
历史:
|
||
|
|
- 最初版本是回灌 search_title_suggestions(articles trigger 维护的真实标题)
|
||
|
|
- 0011 迁移删了 search_title_suggestions(产品决定只展示 keyword 续接词)
|
||
|
|
- 现在脚本只做一件事:立即跑一次 refresh_search_keywords()
|
||
|
|
|
||
|
|
用法:
|
||
|
|
docker compose exec api python -m app.scripts.refresh_search_keywords
|
||
|
|
# 预期: search_keywords refreshed
|
||
|
|
|
||
|
|
性能:ts_stat 1545 篇文章全量聚合 ~88s(每天 worker 03:00 会自动跑一次,通常不需要手动)
|
||
|
|
"""
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import asyncio
|
||
|
|
import logging
|
||
|
|
import sys
|
||
|
|
|
||
|
|
from sqlalchemy import text
|
||
|
|
|
||
|
|
from app.database import AsyncSessionLocal
|
||
|
|
|
||
|
|
logger = logging.getLogger("news.refresh_keywords")
|
||
|
|
logging.basicConfig(
|
||
|
|
level="INFO",
|
||
|
|
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
async def refresh() -> None:
|
||
|
|
async with AsyncSessionLocal() as s:
|
||
|
|
await s.execute(text("SELECT refresh_search_keywords()"))
|
||
|
|
await s.commit()
|
||
|
|
logger.info("search_keywords refreshed")
|
||
|
|
|
||
|
|
|
||
|
|
def main() -> int:
|
||
|
|
try:
|
||
|
|
asyncio.run(refresh())
|
||
|
|
except KeyboardInterrupt:
|
||
|
|
logger.warning("interrupted")
|
||
|
|
return 1
|
||
|
|
return 0
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
sys.exit(main())
|