18 Mar, 2026

2 commits

  • tangwang
     
  • 核心改动在 rerank_client.py (line 99):fuse_scores_and_resort 现在按
    rerank * knn * text 的平滑乘法公式计算,优先从 hit["matched_queries"]
    里取 base_query 和 knn_query,并把 _text_score / _knn_score
    一并写回调试字段。为了让 KNN 也有名字,我给 top-level knn 加了 name:
    "knn_query",见 es_query_builder.py (line 273)。搜索执行时会在 rerank
    窗口内打开 include_named_queries_score,并在显式排序时加上
    track_scores,见 searcher.py (line 400) 和 es_client.py (line 224)。
    tangwang
     

17 Mar, 2026

3 commits

  • tangwang
     
  • tangwang
     
  • - Rename indexer/product_annotator.py to indexer/product_enrich.py and remove CSV-based CLI entrypoint, keeping only in-memory analyze_products API
    - Introduce dedicated product_enrich logging with separate verbose log file for full LLM requests/responses
    - Change indexer and /indexer/enrich-content API wiring to use indexer.product_enrich instead of indexer.product_annotator, updating tests and docs accordingly
    - Switch translate_prompts to share SUPPORTED_INDEX_LANGUAGES from tenant_config_loader and reuse that mapping for language code → display name
    - Remove hard SUPPORTED_LANGS constraint from LLM content-enrichment flow, driving languages directly from tenant/indexer configuration
    - Redesign LLM prompt generation to support multi-round, multi-language tables: first round in English, subsequent rounds translate the entire table (headers + cells) into target languages using English instructions
    tangwang
     

16 Mar, 2026

1 commit


13 Mar, 2026

3 commits


12 Mar, 2026

3 commits


11 Mar, 2026

6 commits

  • 去掉 START_* 控制变量逻辑,默认只启动核心服务 backend/indexer/frontend。
    可选服务改为显式命令:./scripts/service_ctl.sh start embedding
    translator reranker tei cnclip。
    统一 translator 端口读取为 TRANSLATION_PORT(移除 TRANSLATOR_PORT
    兼容)。
    保留未知服务强校验。
    关键文件:service_ctl.sh
    “重名/歧义”修复
    frontend 端口命名统一:FRONTEND_PORT 为主,PORT 仅后备。
    start_frontend.sh 显式导出 PORT="${FRONTEND_PORT}",避免配置了
    FRONTEND_PORT 但服务仍跑 6003 的问题。
    文件:start_frontend.sh、frontend_server.py、env_config.py
    日志/PID 命名治理继续收口
    统一规则继续落地为 logs/<service>.log、logs/<service>.pid。
    cnclip 保持 logs/cnclip.log + logs/cnclip.pid。
    文件:service_ctl.sh、start_cnclip_service.sh、stop_cnclip_service.sh
    backend/indexer 启动风格统一补齐相关项
    frontend/translator 也对齐到 set -euo pipefail,并用 exec 直启主进程。
    文件:start_frontend.sh、start_translator.sh、start_backend.sh、start_indexer.sh
    legacy 入口清理
    删除:start_servers.py、stop_reranker.sh、stop_translator.sh。
    reranker 停止逻辑并入 service_ctl(含 VLLM::EngineCore 清理)。
    benchmark 脚本改为统一入口:service_ctl.sh stop reranker。
    文件:benchmark_reranker_1000docs.sh
    tangwang
     
  • tangwang
     
  • tangwang
     
  • 补充之前两个git commit的注释:
    `be3f0d4`
    **Indexer:补齐内容富化链路与批处理能力,完善契约/回归测试**
    - **新增富化流程**:在 `document_transformer` / `spu_transformer`
      中加入面向 SPU 的内容富化(enrich-content)处理与字段组装逻辑。
    - **增强增量索引**:`incremental_service`
      增加富化相关的处理分支与必要的边界/兼容逻辑。
    - **批处理与稳定性**:`process_products`
      调整处理节奏/批次边界,降低大批量处理时的失败率与抖动。
    - **测试补齐**:新增 CI
      级接口契约测试与批处理/富化相关单测,覆盖服务行为与关键路径回归。
    
    ---
    `9f5994b`
    
    **Reranker 微服务:上线与调优文档 + 批处理后端改造 + 性能基准脚本**
    - **文档体系完善**:补充 `reranker/DEPLOYMENT_AND_TUNING.md`、更新
      `reranker/README.md`,沉淀部署、参数选择、性能调优方法。
    - **后端能力增强**:新增/完善批处理工具 `batching_utils`,并对
      `qwen3_vllm` 后端进行批量推理/吞吐相关优化与适配。
    - **压测与报告**:新增 `scripts/benchmark_reranker_1000docs.sh` 与对应
      `perf_reports/.../report.md`,可复现实测吞吐与延迟数据。
    - **对外/集成入口**:补充 `api/routes/indexer.py`
      相关路由能力,为索引/服务侧集成 reranker 提供接口支撑。
    - **回归测试**:新增批处理工具相关单测,确保 batching 行为稳定、可回归。
    tangwang
     
  • tangwang
     
  • ./scripts/start_tei_service.sh
    START_TEI=0 ./scripts/service_ctl.sh restart embedding
    
    curl -sS -X POST "http://127.0.0.1:6005/embed/text" \
      -H "Content-Type: application/json" \
      -d '["芭比娃娃 儿童玩具", "纯棉T恤 短袖"]'
    tangwang
     

10 Mar, 2026

5 commits

  • 和微服务(embedding/translate/rerank)。
    
    **新增文件**
    -
    压测主脚本:[perf_api_benchmark.py](/data/saas-search/scripts/perf_api_benchmark.py:1)
    -
    自定义用例模板:[perf_cases.json.example](/data/saas-search/scripts/perf_cases.json.example:1)
    
    **文档更新**
    -
    在接口对接文档增加“接口级压测脚本”章节:[搜索API对接指南.md](/data/saas-search/docs/搜索API对接指南.md:2089)
    
    **支持的场景**
    - `backend_search` -> `POST /search/`
    - `backend_suggest` -> `GET /search/suggestions`
    - `embed_text` -> `POST /embed/text`
    - `translate` -> `POST /translate`
    - `rerank` -> `POST /rerank`
    - `all` -> 依次执行上述全部场景
    
    **你可以直接执行的命令**
    1. `./.venv/bin/python scripts/perf_api_benchmark.py --scenario
       backend_suggest --tenant-id 162 --duration 30 --concurrency 50`
    2. `./.venv/bin/python scripts/perf_api_benchmark.py --scenario
       backend_search --tenant-id 162 --duration 30 --concurrency 20`
    3. `./.venv/bin/python scripts/perf_api_benchmark.py --scenario all
       --tenant-id 162 --duration 60 --concurrency 30 --output
    perf_reports/all.json`
    4. `./.venv/bin/python scripts/perf_api_benchmark.py --scenario all
       --tenant-id 162 --cases-file scripts/perf_cases.json.example
    --duration 60 --concurrency 40 --output perf_reports/custom_all.json`
    
    **可选参数**
    - `--backend-base` `--embedding-base` `--translator-base`
      `--reranker-base`:切到你的实际服务地址
    - `--max-requests`:限制总请求数
    - `--max-errors`:错误达到阈值提前停止
    - `--pause`:`all` 模式下场景间暂停
    
    **本地已验证**
    - `backend_suggest` 小规模并发压测成功(200,成功率 100%)
    - `backend_search` 小规模并发压测成功(200,成功率 100%)
    - `translate` 小规模并发压测成功(200,成功率 100%)
    tangwang
     
  • tangwang
     
  • tangwang
     
  • - 配置改为“字段基名 + 动态语言后缀”方案,已不再依赖旧 `indexes`。
    [config.yaml](/data/saas-search/config/config.yaml#L17)
    - `search_fields` / `text_query_strategy` 已进入强校验与解析流程。
    [config_loader.py](/data/saas-search/config/config_loader.py#L254)
    
    2. 查询语言计划与翻译等待策略
    - `QueryParser` 现在产出
      `query_text_by_lang`、`search_langs`、`source_in_index_languages`。
    [query_parser.py](/data/saas-search/query/query_parser.py#L41)
    - 你要求的两种翻译路径都在:
      - 源语言不在店铺 `index_languages`:`translate_multi_async` + 等待
        future
      - 源语言在 `index_languages`:`translate_multi(...,
        async_mode=True)`,尽量走缓存
    [query_parser.py](/data/saas-search/query/query_parser.py#L284)
    
    3. ES 查询统一文本策略(无 AST 分支)
    - 主召回按 `search_langs` 动态拼 `field.{lang}`,翻译语种做次权重
      `should`。
    [es_query_builder.py](/data/saas-search/search/es_query_builder.py#L454)
    - 布尔 AST 路径已删除,仅保留统一文本策略。
    [es_query_builder.py](/data/saas-search/search/es_query_builder.py#L185)
    
    4. LanguageDetector 优化
    - 从“拉丁字母默认英文”升级为:脚本优先 +
      拉丁语系打分(词典/变音/后缀)。
    [language_detector.py](/data/saas-search/query/language_detector.py#L68)
    
    5. 布尔能力清理(补充)
    - 已删除废弃模块:
    [boolean_parser.py](/data/saas-search/search/boolean_parser.py)
    - `search/__init__` 已无相关导出。
    [search/__init__.py](/data/saas-search/search/__init__.py)
    
    6. `indexes` 过时收口(补充)
    - 兼容函数改为基于动态字段生成,不再依赖 `config.indexes`。
    [utils.py](/data/saas-search/config/utils.py#L24)
    - Admin 配置接口改为返回动态字段配置,不再暴露 `num_indexes`。
    [admin.py](/data/saas-search/api/routes/admin.py#L52)
    
    7. suggest
    tangwang
     
  • tangwang
     

09 Mar, 2026

1 commit


08 Mar, 2026

1 commit


07 Mar, 2026

1 commit


06 Mar, 2026

1 commit


05 Mar, 2026

1 commit


02 Mar, 2026

3 commits

  • - 新增 suggestion 模块(mapping/builder/service),支持按租户构建 `search_suggestions_tenant_{tenant_id}` 索引
    - 新增 `main.py build-suggestions` CLI 与 `scripts/build_suggestions.sh`,支持基于商品 title/qanchors 与近 365 天搜索日志的全量构建
    - 实现 `/search/suggestions` 接口(多语言 + 结果直达),并接入前端自动补全使用新的后端 API
    - 为 suggestion 增加 `README` / `RUNBOOK` / `TROUBLESHOOTING` 文档,更新搜索 API 对接指南与速查表
    - 补充 `tests/test_suggestions.py` 单元测试,覆盖语言解析和 SuggestionService 查询流程
    
    Made-with: Cursor
    tangwang
     
  • tangwang
     
  • - 新增 /indexer/build-docs 与 /indexer/build-docs-from-db 接口:前者接收上游传入的 SPU/SKU/Option 原始行数据构建 ES doc(不写 ES),后者在测试场景下基于 tenant_id+spu_ids 内部查库并复用同一套文档构建逻辑
    - 调整增量与全量索引 SQL 与聚合逻辑:移除 shoplazza_product_spu.compare_at_price 读取,统一从 SKU 表聚合最大 compare_at_price,修复 1054 列不存在错误,保证 ES 字段 compare_at_price 来源与索引字段说明v2 保持一致
    - 更新 SPUDocumentTransformer:完善价格区间计算、compare_at_price 聚合以及多语言字段输出,确保输出结构与 mappings/search_products.json、Java 侧 ProductIndexDocument 完全对齐
    - 为 indexer 模块补充 README 与 prompts:系统化说明 Java 调度 + Python 富化的职责划分、翻译缓存方案(Redis translation:{tenant_id}:{target_lang}:{md5(text)})以及 HTTP 接口使用方式
    - 更新顶层 README、搜索API对接指南与测试Pipeline说明:增加关于 indexer 专用服务(serve-indexer, 端口6004)、正式文档构建接口以及手动链路验证(MySQL → build-docs → ES 查询对比)的说明
    - 清理并修正 ES 诊断脚本 docs/常用查询 - ES.md:统一改为 per-tenant 索引 search_products_tenant_{tenant_id},修正过期字段名(keywords 等)和分面聚合字段(去掉 .keyword,使用当前 mapping 中的字段)
    
    Made-with: Cursor
    tangwang
     

21 Feb, 2026

1 commit


06 Feb, 2026

1 commit

  • ---
    
     1. `search/es_query_builder.py`:`_all` 分支
    
    - **普通字段**(如 `tags_all`, `category1_name_all`):
      - 键以 `_all` 结尾时,先去掉后缀得到 ES 字段名。
      - 若值为**数组**:生成 `bool.must`,内含多个 `term`,即多值 **AND**。
      - 若值为**单值**:生成一个 `term`。
    - **specifications_all**:
      - 值为 `[{name, value}, ...]` 时,为每一项生成一个 nested 查询,全部放入同一个 `bool.must`,即列表内所有规格条件都要满足(AND)。
    
    原有逻辑不变:不带 `_all` 的字段,数组仍为 OR(`terms`),单值仍为 `term`。
    
     2. `api/models.py`:filters 说明
    
    - 在 `filters` 的 `description` 中补充:
      - 字段名加 `_all` 表示 AND(如 `tags_all: ['A','B']` 表示同时包含 A 和 B)。
      - `specifications_all` 表示列表内所有规格条件都要满足。
    
     3. `docs/搜索API对接指南.md`:文档
    
    - 在 3.3.1 开头说明:任意字段名可加 `_all` 后缀表示多值 AND。
    - 在格式示例中增加 `tags_all`、`category1_name_all` 示例。
    - 在「支持的值类型」中说明:数组在带 `_all` 时为 AND。
    - 新增小节「`*_all` 语义(多值 AND)」:说明用法及 `specifications_all` 行为。
    - 在「常用过滤字段」中补充:以上字段均可加 `_all` 后缀。
    
    ---
    
    **使用示例**
    
    ```json
    {
      "filters": {
        "tags": ["手机", "促销"],
        "tags_all": ["手机", "促销", "新品"]
      }
    }
    ```
    
    - `tags`:命中「手机」或「促销」或两者都有(OR)。
    - `tags_all`:必须同时包含「手机」「促销」「新品」三个标签(AND)。
    tangwang
     

05 Feb, 2026

2 commits

  • tangwang
     
  • - API:新增请求参数 ai_search,开启时在窗口内走重排流程
    - 配置:RerankConfig 移除 enabled/expression/description,仅保留 rerank_window 及
      service_url/timeout_sec/weight_es/weight_ai;默认超时 15s
    - 重排流程:ai_search 且 from+size<=rerank_window 时,ES 取前 rerank_window 条,
      调用外部 /rerank 服务,融合 ES 与重排分数后按 from/size 分页;否则不重排
    - search/rerank_client:新增模块,封装 build_docs、call_rerank_service、
      fuse_scores_and_resort、run_rerank;超时单独捕获并简短日志
    - search/searcher:移除 RerankEngine,enable_rerank=ai_search,使用 config.rerank 参数
    - 删除 search/rerank_engine.py(本地表达式重排),统一为外部服务一种实现
    - 文档:搜索 API 对接指南补充 ai_search 与 relevance_score 说明
    - 测试:conftest 中 rerank 配置改为新结构
    
    Co-authored-by: Cursor <cursoragent@cursor.com>
    tangwang
     

04 Feb, 2026

1 commit



06 Jan, 2026

2 commits

  • tangwang
     
  • mappings/search_products.json:把原来的 title_zh/title_en/brief_zh/... 改成 按语言 key 的对象结构( /products/_doc/1 { "title": {"en":...} } )
    同时在这些字段下 预置了全部 analyzer 语言:
    arabic, armenian, basque, brazilian, bulgarian, catalan, chinese, cjk, czech, danish, dutch, english, finnish, french, galician, german, greek, hindi, hungarian, indonesian, italian, norwegian, persian, portuguese, romanian, russian, spanish, swedish, turkish, thai
    
    实现为 type: object + properties,同时满足“按语言灌入”和“按语言 analyzer”。
    索引灌入(全量/增量/transformer)已同步改完
    indexer/document_transformer.py:输出从 title_zh/title_en/... 改为:
    title: {<primary_lang>: 原文, en?: 翻译, zh?: 翻译}
    brief/description/vendor 同理
    category_path/category_name_text 也改为语言对象(避免查询侧继续依赖旧字段)
    indexer/incremental_service.py:embedding 取值从 title_en/title_zh 改为从 title 对象里优先取 en,否则取 zh,否则取任一可用语言。
    查询侧与配置、API/文档已同步
    search/es_query_builder.py:查询字段统一改成点路径:title.zh / title.en / vendor.zh / vendor.zh.keyword / category_name_text.zh 等。
    config/config.yaml:field boosts / indexes 里的字段名同步为新点路径。
    API & formatter:
    api/result_formatter.py 已支持新结构(并保留对旧 *_zh/_en 的兼容兜底)。
    api/models.py、相关 docs/examples 里的 vendor_zh.keyword 等已更新为 vendor.zh.keyword。
    文档/脚本:docs/、README.md、scripts/ 里所有旧字段名引用已批量替换为新结构。
    tangwang
     

22 Dec, 2025

1 commit