diff --git a/README.md b/README.md index 60d0b19..798ebc9 100644 --- a/README.md +++ b/README.md @@ -1234,12 +1234,11 @@ curl -X GET "http://127.0.0.1:8000/api/test/pron/start?count=5&lang=fr-FR" \ ### 15. 部署说明 -1. 安装依赖: `pip install -r requirements.txt` -2. 配置数据库连接 (settings.py) -3. 配置百度翻译API密钥 (BAIDU_APPID, BAIDU_APPKEY) -4. 启动Redis服务 -5. 运行数据库迁移 -6. 启动服务: `python main.py` +1. 安装依赖:`uv pip install -r requirements.txt`(或使用 `pip install -r requirements.txt`) +2. 配置环境:在项目根目录准备 `.env`,写入数据库、Redis、邮件、翻译等密钥(字段参考 `settings.Settings`) +3. 确保 MySQL 与 Redis 服务已启动并与 `.env` 中的连接信息匹配 +4. 初始化数据库(首次部署):`aerich upgrade` +5. 启动服务:`uvicorn main:app --host 0.0.0.0 --port 8000`(开发环境可加 `--reload`) --- diff --git a/app/api/search_dict/routes.py b/app/api/search_dict/routes.py index 2e9288b..e27ee99 100644 --- a/app/api/search_dict/routes.py +++ b/app/api/search_dict/routes.py @@ -237,44 +237,105 @@ async def search_proverb(proverb_id: int = Form(...), user=Depends(get_current_u @dict_search.post("/search/list/idiom") -async def search_idiom_list(query_idiom: ProverbSearchRequest, user=Depends(get_current_user)): +async def search_idiom_list( + query_idiom: ProverbSearchRequest, + user=Depends(get_current_user) +): + """日语成语检索接口(带语言检测与分类逻辑)""" + if query_idiom.dict_language == "fr": raise HTTPException(status_code=400, detail="Dict language Error") + # 语言检测 mapping_query, lang, is_kangji = await service.detect_language(text=query_idiom.query) query = query_idiom.query - # ✅ 并发任务列表 - tasks = [ - service.suggest_proverb( - query=query, - lang=lang, - model=IdiomJp, - search_field="search_text", - target_field="text", - ) - ] + # 初始化任务列表 + tasks = [] - if lang == "zh" and is_kangji: - # jp_query = all_in_kana(text=query_idiom.query) + # ✅ 分类逻辑入口 + # --- 1️⃣ 日语输入 --- + if lang == "jp": + if is_kangji: + # 有汉字的日语词 → 进行 text + search_text 双字段匹配 + tasks.append( + service.suggest_proverb( + query=query, + lang="jp", + model=IdiomJp, + search_field="text", + ) + ) + tasks.append( + service.suggest_proverb( + query=query, + lang="jp", + model=IdiomJp, + search_field="search_text", + target_field="text", + ) + ) + else: + # 平假名或片假名纯日文 + tasks.append( + service.suggest_proverb( + query=query, + lang="jp", + model=IdiomJp, + search_field="search_text", + target_field="text", + ) + ) + + # --- 2️⃣ 中文输入 --- + elif lang == "zh": tasks.append( service.suggest_proverb( - query=mapping_query, + query=query, + lang="zh", + model=IdiomJp, + search_field="search_text", + target_field="text", + ) + ) + # 若输入为汉字,可能存在对应的日语原型(mapping_query) + if is_kangji and mapping_query: + tasks.append( + service.suggest_proverb( + query=mapping_query, + lang="jp", + model=IdiomJp, + search_field="text", + ) + ) + + # --- 3️⃣ 其他语言(默认回退) --- + else: + tasks.append( + service.suggest_proverb( + query=query, lang="jp", model=IdiomJp, - search_field="text", + search_field="search_text", + target_field="text", ) ) - # ✅ 并发执行(返回结果顺序与任务顺序一致) + # ✅ 并发执行任务 results = await asyncio.gather(*tasks) - # ✅ 合并结果 - result = results[0] - if len(results) > 1: - result[:0] = results[1] # 将中文映射查询结果插到最前面 + # ✅ 结果合并 + if not results: + return {"list": []} - return {"list": result} + merged = [] + for res in results: + merged.extend(res) + + # ✅ 去重(如果你希望返回唯一成语) + unique_list = {item["text"]: item for item in merged}.values() + + return {"list": list(unique_list)} @dict_search.post("/search/idiom")