当一部分商品可直接打开、分类页也可能显示,但站内搜索找不到时,先选择一个“正常 SKU”和一个“缺失 SKU”做对照。不要一开始就全量重建搜索索引;对照能快速判断是商品资格、索引写入还是查询分析问题。

第一关:商品是否具备进入搜索索引的资格

在后台逐项比较两个 SKU:Enabled 状态、Visibility、分配网站、所属分类、库存状态、Store View 是否覆盖名称。可见性必须包含 Search;仅 Catalog 的商品不会出现在普通搜索结果。

php bin/magento indexer:status catalogsearch_fulltext
php bin/magento store:list

SELECT entity_id, sku FROM catalog_product_entity
WHERE sku IN ('GOOD-SKU','MISS-SKU');

多来源库存环境还要比较目标销售渠道绑定的 Stock,而不是只看 Source Quantity。可售量小于等于 0 且配置为不显示缺货商品时,索引或查询会过滤该商品。

第二关:缺失 SKU 是否进入搜索引擎文档

先从配置确认搜索引擎地址和索引前缀,不要猜索引名:

php bin/magento config:show catalog/search/engine
php bin/magento config:show catalog/search/opensearch_server_hostname
php bin/magento config:show catalog/search/opensearch_index_prefix
curl -s 'http://127.0.0.1:9200/_cat/indices?v'

在非公网监听的管理节点查询对应索引,按 SKU 或 entity_id 查文档。若正常 SKU 有文档而缺失 SKU 没有,重点回到增量索引和商品资格;两者都有文档,则检查查询字段与 analyzer。

第三关:增量索引是否漏掉变更

php bin/magento indexer:show-mode catalogsearch_fulltext
php bin/magento indexer:status catalogsearch_fulltext
SELECT * FROM mview_state WHERE view_id='catalogsearch_fulltext';

若模式为 Update by Schedule,检查 Cron 是否在推进版本。只有在确认没有正在运行的索引进程后,再执行:

php bin/magento indexer:reindex catalogsearch_fulltext
php bin/magento cache:clean full_page block_html

重建后立刻出现、下一次商品修改又消失,说明增量链路有问题,不应把定时全量 reindex 当永久方案。

用索引器维度表记录每次实验

同一个商品可能同时受 catalogsearch_fulltext、catalog_category_product、inventory 和 price 索引影响。建议在排查单中为“正常 SKU”和“缺失 SKU”各记录:商品更新时间、索引器 mode、mview version、OpenSearch 文档时间、前台首次恢复时间。这样可以判断是变更根本没有进入 changelog,还是 changelog 已消费但文档写入失败。

SELECT view_id, version_id, status, updated
FROM mview_state
WHERE view_id IN ('catalogsearch_fulltext','inventory');

SHOW TABLES LIKE '%_cl';

不要随意清空 changelog 表。version_id 与 changelog 最大版本之间的差距能说明积压量,手工删除会让尚未消费的变更永久丢失。

搜索词本身也可能被分析器改变

分别搜索完整 SKU、商品名称中的独特词、名称前半段和带连字符的原词。完整 SKU 能找到但中文名称找不到,检查搜索属性权重、分词与同义词;名称能找到但 SKU 找不到,确认 SKU 属性是否参与搜索以及自定义 analyzer 是否拆分特殊字符。

记录前台请求的 Store Code 和搜索词,再查看 OpenSearch 慢日志或临时抓取查询。不要在生产长期开启完整请求日志,因为搜索词可能包含客户输入。

修复后的验收方式

  • 目标 Store View 的关键词能找到缺失 SKU;
  • 换到未分配的网站时仍不会错误出现;
  • 修改名称后,按当前索引模式在合理时间内更新;
  • 禁用商品或移除网站分配后,搜索结果会消失;
  • 分类页、搜索页和 GraphQL/REST 的可见性结果一致。

这一组正反测试能防止“为找回一个商品而把不可售商品全部放进搜索”的副作用。