# Suggestion 故障排查手册(Phase 2) ## 1. `/search/suggestions` 总是空数组 ### 排查步骤 1. 检查 alias 是否存在并有数据: ```bash ALIAS_NAME="${ES_INDEX_NAMESPACE:-}search_suggestions_tenant_162_current" curl "$ES_HOST/$ALIAS_NAME/_count?pretty" ``` 2. 直接抽样查看: ```bash curl "$ES_HOST/$ALIAS_NAME/_search?pretty" -H 'Content-Type: application/json' -d '{ "size": 20, "query": {"match_all": {}}, "_source": ["lang", "text", "rank_score", "query_count_30d"] }' ``` 3. 确认请求租户和语言: ```bash curl "http://localhost:6002/search/suggestions?q=shirt&size=10&language=en" \ -H "X-Tenant-ID: 162" ``` ## 2. 报错:`tenant_id is required` 请求缺少 `X-Tenant-ID`(或 query `tenant_id`)。 示例: ```bash curl "http://localhost:6002/search/suggestions?q=shirt&size=10&language=en&tenant_id=162" ``` ## 3. 增量更新没有写入(`updated_terms=0`) ### 常见原因 - watermark 时间窗内没有新日志 - `overlap_minutes` 太小 - `min_query_len` 过滤过严 ### 处理 ```bash ./scripts/build_suggestions.sh 162 --mode incremental --overlap-minutes 60 ``` 并在 MySQL 中确认窗口内日志存在。 ## 4. alias 未切到新索引 ### 检查 ```bash ALIAS_NAME="${ES_INDEX_NAMESPACE:-}search_suggestions_tenant_162_current" curl "$ES_HOST/_alias/$ALIAS_NAME?pretty" ``` ### 处理 重新执行全量发布: ```bash ./scripts/build_suggestions.sh 162 --mode full --publish-alias --keep-versions 2 ``` ## 5. ES 401:`missing authentication credentials` ES 开启鉴权时,所有 curl 都需要 `-u "$ES_USERNAME:$ES_PASSWORD"` 或 API Key。 ## 6. 构建脚本报 `Cannot connect to Elasticsearch` 检查 `ES_HOST`、账号密码、网络连通性: ```bash echo "$ES_HOST" curl -u "$ES_USERNAME:$ES_PASSWORD" "$ES_HOST" ``` ## 7. 首次增量执行失败:找不到 active index 说明该租户尚未完成全量构建。可直接启用 bootstrap(默认开启): ```bash ./scripts/build_suggestions.sh 162 --mode incremental --bootstrap-if-missing ``` 或先执行一次全量。 ## 8. `q=F` 这类前缀为空,但商品里明明有 `F...` 标题 ### 典型原因 - suggestion 索引里只写入了 query_log,没写入商品 title(例如商品文档缺少 `spu_id`,但有 `id`)。 - 英文标题太长,被噪声过滤(现在会自动提取前导短语,例如 `Furby Furblets 2-Pack`)。 ### 逐条排查 1. 看 suggestion alias 是否有 `en` 文档: ```bash ALIAS_NAME="${ES_INDEX_NAMESPACE:-}search_suggestions_tenant_162_current" curl -u "$ES_USERNAME:$ES_PASSWORD" "$ES_HOST/$ALIAS_NAME/_search?pretty" \ -H 'Content-Type: application/json' \ -d '{"size":0,"aggs":{"langs":{"terms":{"field":"lang","size":20}}}}' ``` 2. 查 `en` 下是否有 `f` 前缀: ```bash curl -u "$ES_USERNAME:$ES_PASSWORD" "$ES_HOST/$ALIAS_NAME/_search?pretty" \ -H 'Content-Type: application/json' \ -d '{"size":20,"_source":["text","text_norm","lang"],"query":{"bool":{"filter":[{"term":{"lang":"en"}}],"must":[{"prefix":{"text_norm":"f"}}]}}}' ``` 3. 对照商品索引确认源数据确实存在 `F...`: ```bash curl -u "$ES_USERNAME:$ES_PASSWORD" "$ES_HOST/search_products_tenant_162/_search?pretty" \ -H 'Content-Type: application/json' \ -d '{"size":20,"_source":["id","spu_id","title.en"],"query":{"match_phrase_prefix":{"title.en":"f"}}}' ``` 4. 重建后再测 API: ```bash ./scripts/rebuild_suggestions.sh 162 curl "http://localhost:6002/search/suggestions?q=F&size=40&language=en&tenant_id=162" ```