商品保存成功,直接 URL 能打开或后台能找到,但前台输入 SKU、名称都没有结果。搜索结果会经过 Website、Store、状态、可见性、库存和搜索索引过滤,不能只运行一次 reindex 就结束。

先在后台核对五个条件

  1. 商品已分配到当前 Website;
  2. 目标 Store View 下 Status=Enabled;
  3. Visibility 包含 Search;
  4. 当前 Website 对应 Stock 中可售;
  5. 名称、SKU 或目标属性配置为 Use in Search。

多 Store 商品常在 Default Config 正常,但目标 Store 的名称为空、状态被覆盖或 Website 根本未分配。

用 SQL 快速确认实体和网站

SELECT entity_id, sku FROM catalog_product_entity
WHERE sku = 'SKU-001';

SELECT product_id, website_id
FROM catalog_product_website
WHERE product_id = 1234;

EAV 状态和可见性不要凭 attribute_id 硬猜,先从 eav_attribute 查 attribute_id 和 backend_type,再读取对应表。

检查索引状态与积压

bin/magento indexer:status
bin/magento indexer:show-mode
bin/magento cron:run --group=index
bin/magento indexer:reindex catalogsearch_fulltext

手工 reindex 只用于诊断。若商品随后出现,再修改一次名称,确认 Update by Schedule 能自动更新;否则应继续修 Cron/MView。

确认 Magento 连的是哪套搜索服务

bin/magento config:show catalog/search/engine
bin/magento config:show catalog/search/opensearch_server_hostname
bin/magento config:show catalog/search/opensearch_server_port
curl -sS 'http://OPENSEARCH:9200/_cluster/health?pretty'
curl -sS 'http://OPENSEARCH:9200/_cat/indices?v'

命令行检查的 endpoint 必须与应用配置一致。不要在生产输出认证密码,也不要因为一个商品缺失就删除全部索引。

按 SKU 检查搜索文档

先从 Magento 当前索引别名确定实际 index,再做只读查询:

GET /magento2_product_1/_search
{
  "query": {
    "term": { "sku.keyword": "SKU-001" }
  }
}

字段映射随版本变化,先查看 mapping。文档不存在,问题在索引输入;文档存在但搜索无结果,检查 analyzer、Store/website 字段、查询过滤和主题/搜索扩展。

搜索词本身也可能被配置过滤

Minimum Query Length、停用词、同义词和第三方搜索规则会影响结果。用完整 SKU 与唯一名称分别测试,并比较 GraphQL/REST 搜索和前台主题请求,确认问题在后端还是前端展示。

最终验证不只看一个关键词:测试 SKU、名称、目标属性、分类页和不同 Store View,确认新商品可被找到,而禁用或不可售商品仍按业务规则隐藏。