16 Mar, 2026

2 commits


13 Mar, 2026

4 commits


12 Mar, 2026

1 commit


11 Mar, 2026

3 commits


10 Mar, 2026

3 commits

  • 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

2 commits


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
     
  • - 新增 `suggestion` 模块:
      - `suggestion/mapping.py`:`search_suggestions` mapping 生成(多语言 `completion` + `search_as_you_type`)
      - `suggestion/builder.py`:全量构建程序(扫描 `search_products` 的 `title/qanchors` + MySQL `shoplazza_search_log`)
      - `suggestion/service.py`:在线查询服务(suggestion 检索 + 结果直达商品二次查询)
      - `suggestion/__init__.py`
    
    - 接入 API 服务初始化:
      - `api/app.py` 新增 `SuggestionService` 初始化和 `get_suggestion_service()`
    
    - 接口实现:
      - `api/routes/search.py` 的 `GET /search/suggestions` 从“空框架”改为真实调用
      - 支持参数:
        - `q`, `size`, `language`
        - `with_results`(是否直达商品)
        - `result_size`(每条 suggestion 商品数)
        - `debug`
      - 继续要求 `X-Tenant-ID`(或 query 的 `tenant_id`)
    
    - 模型补充:
      - `api/models.py` 增加 suggestion 请求/响应字段(`language`, `resolved_language`, `with_results`, `result_size`)
    
    - CLI 全量构建命令:
      - `main.py` 新增 `build-suggestions`
      - 使用方式:
        - `python main.py build-suggestions --tenant-id 1 --recreate`
        - 可选:`--days 30 --batch-size 500 --min-query-len 1 --es-host ...`
    
    ---
    
     关键实现逻辑(已编码)
    
    - 语言归属优先级(按你要求):
      - `shoplazza_search_log.language` > `request_params.language` > 脚本/模型兜底
    - 候选词聚合键:
      - `(tenant_id, lang, text_norm)`(文档唯一)
    - 评分:
      - 基于 `query_count_30d/7d + qanchor_doc_count + title_doc_count` 的离线分
    - 结果直达:
      - 对每条 suggestion 在 `search_products_tenant_{id}` 做二次查询(`qanchors/title` 组合)
    
    ---
    
     变更文件
    
    - `api/app.py`
    - `api/models.py`
    - `api/routes/search.py`
    - `main.py`
    - `suggestion/__init__.py`
    - `suggestion/mapping.py`
    - `suggestion/builder.py`
    - `suggestion/service.py`
    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
     

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
     

26 Jan, 2026

1 commit


06 Jan, 2026

1 commit


27 Dec, 2025

1 commit


19 Dec, 2025

1 commit

  • 1. 添加 asyncio 导入
    在文件顶部添加 import asyncio,用于在线程池中执行同步阻塞操作
    2. 修改 /indexer/reindex 路由(全量索引)
    使用 loop.run_in_executor() 将 service.bulk_index() 放到线程池执行
    避免阻塞事件循环,允许其他请求并行处理
    3. 修改 /indexer/index 路由(增量索引)
    使用 loop.run_in_executor() 将 service.index_spus_to_es() 放到线程池执行
    确保全量索引和增量索引可以并行执行
    工作原理
    线程池执行:同步阻塞操作(如数据库查询、ES 写入)在线程池中执行,不阻塞事件循环
    并发支持:
    全量索引占用一个线程
    增量索引可同时使用其他线程
    多个增量请求可并行处理
    资源管理:
    数据库连接池(pool_size=10, max_overflow=20)可支持并发请求
    uvicorn 默认线程池(40 个线程)可处理多个并发请求
    tangwang
     

18 Dec, 2025

2 commits

  • 新增:scripts/recreate_index.py
    功能:初始化 indexer 的 ES/DB 服务,然后调用 BulkIndexingService.bulk_index(…, recreate_index=True) 为指定 tenant_id 做「删除并重建索引 + 全量导入」。
    用法示例:
    cd /home/tw/SearchEngine# 使用默认 batch_size=500python scripts/recreate_index.py 162# 指定 batch_sizepython scripts/recreate_index.py 162 --batch-size 1000
    脚本依赖和 Indexer API 一样的环境变量:DB_HOST/DB_PORT/DB_DATABASE/DB_USERNAME/DB_PASSWORD、ES_HOST/ES_USERNAME/ES_PASSWORD。
    2. 清理与引用更新
    原来的 scripts/recreate_index.sh 已经删除。
    api/routes/indexer.py 里的说明改成引用 scripts/recreate_index.py。
    docs/搜索API对接指南.md 中的提示也从 .sh 改为:
    > python scripts/recreate_index.py <tenant_id> [--batch-size 500]
    tangwang
     
  • 新增 api/indexer_app.py,在独立进程(默认 6004)中初始化 ES + DB + 索引服务,并复用 api/routes/indexer.py 一套路由
    新增 api/service_registry.py,通过注册表向索引路由注入 ES 客户端和索引服务,消除重复代码与循环依赖
    main.py 增加 serve-indexer 子命令;scripts/start.sh / stop.sh / start_backend.sh / start_indexer.sh 支持独立管理索引进程
    文档中所有索引相关示例由 6002/indexer/* 统一调整为 6004/indexer/*
    tangwang
     

09 Dec, 2025

2 commits


08 Dec, 2025

2 commits

  • 新增功能:
    - 新增 POST /indexer/index 增量索引接口,支持按SPU ID列表进行增量索引
    - 新增 indexer/indexer_logger.py 索引日志模块,统一记录全量和增量索引日志到 logs/indexer.log(JSON格式)
    - IncrementalIndexerService 新增 index_spus_to_es 方法,实现增量索引功能
    
    接口重命名:
    - POST /indexer/bulk -> POST /indexer/reindex(全量重建索引)
    - POST /indexer/incremental -> POST /indexer/index(增量索引)
    - POST /indexer/spus -> POST /indexer/documents(查询文档)
    
    日志系统:
    - 全量和增量索引操作统一记录到 logs/indexer.log
    - 记录请求参数、处理过程、ES写入结果、成功/失败统计等关键信息
    - 支持按索引类型、租户ID、SPU ID等维度查询日志
    
    文档更新:
    - 更新接口文档,包含新的接口命名和增量索引接口说明
    - 添加日志查询示例(grep和jq两种方式)
    tangwang
     
  • - 新增批量索引接口: POST /indexer/bulk - 全量索引功能
      - SPU接口改进: POST /indexer/spus - 支持批量获取SPU文档(最多100个)
    
    新增 全量索引服务
    indexer/bulk_indexing_service.py
    
    docs/搜索API对接指南.md
      - 新增索引接口文档: 详细的批量索引和SPU索引接口说明
      - 请求示例: 提供完整的curl命令示例
    tangwang
     

07 Dec, 2025

1 commit

  • 主要功能:
    1. 增量数据获取服务
       - 新增 IncrementalIndexerService 提供单个SPU数据获取
       - 新增 /indexer/spu/{spu_id} API接口
       - 服务启动时预加载分类映射等公共数据
       - 提取 SPUDocumentTransformer 统一全量和增量转换逻辑
       - 支持根据租户配置进行语言处理和翻译
    
    3. 租户配置系统
       - 租户配置合并到统一配置文件 config/config.yaml
       - 支持每个租户独立配置主语言和翻译选项
       - 租户162配置为翻译关闭(用于测试)
    
    4. 翻译功能集成
       - 翻译提示词作为DeepL API的context参数传递
       - 支持中英文提示词配置
       - 索引场景:同步翻译,使用缓存
       - 查询场景:异步翻译,立即返回
    
    测试:
    - 新增 indexer/test_indexing.py 和 query/test_translation.py
    - 验证租户162翻译关闭功能
    - 验证全量和增量索引功能
    tangwang
     

02 Dec, 2025

1 commit

  • 1. 加了一个配置searchable_option_dimensions,功能是配置子sku的option1_value option2_value option3_value 哪些参与检索(进索引、以及在线搜索的时候将对应字段纳入搜索field)。格式为list,选择三者中的一个或多个。
    
    2. 索引 @mappings/search_products.json 要加3个字段 option1_values option2_values option3_values,各自的 数据灌入(mysql->ES)的模块也要修改,这个字段是对子sku的option1_value option2_value option3_value分别提取去抽后得到的list。
    searchable_option_dimensions 中配置的,才进索引,比如 searchable_option_dimensions = ['option1'] 则 只对option1提取属性值去重组织list进入索引,其余两个字段为空
    
    3. 在线 对应的将 searchable_option_dimensions 中 对应的索引字段纳入 multi_match 的 fields,权重设为0.5 (各个字段的权重配置放到一起集中管理)
    
    1. 配置文件改动 (config/config.yaml)
    ✅ 在 spu_config 中添加了 searchable_option_dimensions 配置项,默认值为 ['option1', 'option2', 'option3']
    ✅ 添加了3个新字段定义:option1_values, option2_values, option3_values,类型为 KEYWORD,权重为 0.5
    ✅ 在 default 索引域的 fields 列表中添加了这3个字段,使其参与搜索
    2. ES索引Mapping改动 (mappings/search_products.json)
    ✅ 添加了3个新字段:option1_values, option2_values, option3_values,类型为 keyword
    3. 配置加载器改动 (config/config_loader.py)
    ✅ 在 SPUConfig 类中添加了 searchable_option_dimensions 字段
    ✅ 更新了配置解析逻辑,支持读取 searchable_option_dimensions
    ✅ 更新了配置转换为字典的逻辑
    4. 数据灌入改动 (indexer/spu_transformer.py)
    ✅ 在初始化时加载配置,获取 searchable_option_dimensions
    ✅ 在 _transform_spu_to_doc 方法中添加逻辑:
    从所有子SKU中提取 option1, option2, option3 值
    去重后存入 option1_values, option2_values, option3_values
    根据配置决定哪些字段实际写入数据(未配置的字段写空数组)
    
    =
    tangwang
     

01 Dec, 2025

1 commit


27 Nov, 2025

1 commit

  • 1. 搜索API对接指南.md
    在“精确匹配过滤器”部分添加了 specifications 嵌套过滤说明
    支持单个规格过滤和多个规格过滤(OR 逻辑)
    在“分面配置”部分完善了 specifications 分面说明
    添加了两种分面模式:所有规格名称和指定规格名称
    在“常见场景示例”部分添加了场景5-8,包含规格过滤和分面的完整示例
    2. 搜索API速查表.md
    在“精确匹配过滤”部分添加了 specifications 过滤的快速参考
    在“分面搜索”部分添加了 specifications 分面的快速参考
    更新了完整示例,包含 specifications 的使用
    3. Search-API-Examples.md
    在“过滤器使用”部分添加了示例4-6,展示 specifications 过滤
    在“分面搜索”部分添加了示例2-3,展示 specifications 分面
    更新了 Python 和 JavaScript 完整示例,包含 specifications 的使用
    在“常见使用场景”部分添加了场景2.1,展示带规格过滤的搜索结果页
    4. 索引字段说明v2.md
    更新了 specifications 字段的查询示例,包含 API 格式和 ES 查询结构
    添加了两种分面模式的说明和示例
    更新了“分面字段”说明,明确支持指定规格名称的分面
    
    5. 补充参数
    参数说明:sku_filter_dimension 是可选参数,用于按指定维度过滤每个SPU下的SKU
    支持的维度:
    直接选项字段:option1、option2、option3
    规格名称:通过 option1_name、option2_name、option3_name 匹配(如 color、size)
    tangwang
     


13 Nov, 2025

3 commits

  • tangwang
     
  • 创建统一配置文件 config/config.yaml(从 base 配置迁移,移除 customer_name)
    
    创建脚本体系
    启动、停止、重启、moc数据到mysql、从mysql灌入数据到ES 这些脚本
    restart.sh
    run.sh 内部调用 启动前后端
    scripts/mock_data.sh  mock数据 -> mysql
    scripts/ingest.sh  mysql->ES
    tangwang
     
  • 主要变更:
    1. 去掉数据源应用结构配置化,我们只针对店匠的spu sku表设计索引,数据灌入流程是写死的(只是满足测试需求,后面外层应用负责数据全量+增量灌入)。搜索系统主要关注如何适配外部搜索需求
    目前有两个数据灌入脚本,一种是之前的,一种是现在的从两个店匠的表sku表+spu表读取并且以spu为单位组织doc。
       - 配置只关注ES搜索相关配置,提高可维护性
       - 创建base配置(店匠通用配置)
    
    2. 索引结构重构(SPU维度)
       - 所有客户共享search_products索引,通过tenant_id隔离
       - 支持嵌套variants字段(SKU变体数组)
       - 创建SPUTransformer用于SPU数据转换
    
    3. API响应格式优化
       - 约定一套搜索结果的格式,而不是直接暴露ES doc的结构(_id _score _source内的字段)
       - 添加ProductResult和VariantResult模型
       - 添加suggestions和related_searches字段 (预留接口,逻辑暂未实现)
    
    4. 数据导入流程
       - 创建店匠数据导入脚本(ingest_shoplazza.py)
       - Pipeline层决定数据源,配置不包含数据源信息
       - 创建测试数据生成和导入脚本
    
    5. 文档更新
       - 更新设计文档,反映新架构
       - 创建BASE_CONFIG_GUIDE.md使用指南
    tangwang