商品 SKU 是 ABC-123-X,后台能找到,直接打开商品页也正常,但前台搜索完整 SKU 返回空;搜索 ABC 反而有结果。SKU 已经进入数据库,问题多半发生在搜索索引的字段 mapping、分析器分词和查询构造。

先确认索引文档中有没有这个商品

从 Magento 当前使用的搜索索引别名开始,按实体 ID 或 SKU 查询文档。不要猜实际索引名,也不要直接改 mapping;Magento 重建时会创建新索引并切换别名,手工修改很容易丢失。

文档里没有 SKU,检查 catalogsearch_fulltext 索引状态、商品网站分配、状态与可见性;文档存在但搜不到,再分析 token 和查询。

连字符通常会影响 token 边界

标准分析器可能把 ABC-123-X 拆成 abc123x。keyword 类型则保留整个值,但大小写处理取决于 normalizer。索引时和搜索时 analyzer 不一致,会出现完整输入被拆成另一组 token。

POST /YOUR_INDEX/_analyze
{
  "analyzer": "standard",
  "text": "ABC-123-X"
}

在受控工具中执行并使用实际 analyzer。文章示例不代表应把生产索引统一改成 standard。

精确 SKU 应有独立策略

商品名称适合全文分词,SKU 更接近标识符。常见设计是保留一个 normalized keyword 子字段用于精确匹配,同时保留可分词字段支持输入片段;查询时给精确 SKU 更高 boost。若只对整个查询使用 match_phrase,短横线与空格变体仍可能失败。

扩展层可能先清洗输入

搜索建议、同义词或第三方模块可能在发送 OpenSearch 前删除标点、替换连字符或转义错误。记录最终搜索请求 JSON,而不是只看用户输入。PHP 层对 - 当负号、query_string 查询未转义,也会改变语义。

Mapping 变更必须重建

已有字段的 analyzer 通常不能原地改变。通过 Magento 支持的搜索配置或自定义模块声明后创建新索引并全量重建,再验证别名切换。先在预发布比较索引大小、构建时间和常用关键词结果,避免为 SKU 修复破坏自然语言搜索。

回归用例应包含完整 SKU、去掉连字符、大小写变体、前缀、相似商品名和不存在的 SKU。精确命中应排在前面,同时普通关键词相关性不能明显退化。

同义词不要承担标识符修复

为每个 SKU 建同义词既难维护,又可能让旧型号错误匹配新商品。SKU 规范化应该发生在字段与查询策略层,同义词只处理真实语言等价关系。若业务允许用户省略连字符,可在查询时生成受控的 normalized 变体,并给完全一致的原始值最高权重。

搜索建议与正式结果页也要使用相同规范化逻辑。若下拉建议能找到、回车后结果为空,说明两个接口的查询模板或索引字段不同。把同一组 SKU 用例同时跑过 Suggest、Search API 和前台结果页,避免只修一个入口。