
drupal 多语言站点使用 search api + solr 时,常因误启用“translation filter”导致翻译节点索引不全、搜索结果缺失(如应返回6个节点却仅得3个)及排序错乱,本文提供精准排查与修复方法。
drupal 多语言站点使用 search api + solr 时,常因误启用“translation filter”导致翻译节点索引不全、搜索结果缺失(如应返回6个节点却仅得3个)及排序错乱,本文提供精准排查与修复方法。
在 Drupal 多语言环境中,当通过 Search API 集成 Solr 并配合 JSON:API 检索内容时,若搜索空白查询(如 GET /jsonapi/search_api_index/your_index?filter[query]=)仅返回部分节点(例如6个可译节点仅显示3个),且单字段精确搜索可正常命中、但全局检索或排序异常——这通常并非 Solr 配置或索引重建问题,而是 Search API 视图(View)或索引配置中隐式启用了翻译过滤器(Translation filter) 所致。
该过滤器默认绑定于“当前用户语言”或“站点默认语言”,会强制将搜索范围限制在指定语言变体内,导致其他语言的翻译节点(即使已正确发布并索引)被排除在结果集之外。尤其在批量创建/更新多语言节点后触发异步翻译作业(如使用 Content Translation 或第三方翻译服务),若索引未忽略语言维度,则极易引发此现象。
✅ 解决步骤如下:
- 进入 Admin → Configuration → Search and metadata → Search API;
- 找到你正在使用的 Solr 索引(如
solr_multilingual_index),点击 Edit → Filters; - 在 Filter criteria 区域,查找名为 "Content translation" 或 "Translation language" 的过滤器;
- 取消勾选该过滤器(或将其操作改为 Ignore 而非 Filter);
- 保存配置后,务必执行完整索引重建:
drush search-api-reindex your_index_id drush search-api-index your_index_id
⚠️ 注意事项:
- 若需支持按语言筛选的前端搜索(如“仅搜索英文内容”),应在 JSON:API 请求中显式添加语言过滤参数(如
filter[langcode][value]=en),而非依赖全局过滤器; - 确保所有翻译节点均处于 Published 状态且已成功同步至 Solr(可通过 Solr Admin UI 的
/select?q=*:*&fq=site:%22yoursite%22验证文档数量); - 使用
search_api_solr模块时,建议升级至 ≥ 4.3.x 版本,其对多语言字段映射(如title_string_en,body_text_de)的支持更健壮。
修复后,空白查询将返回全部已索引节点(无论语言),排序也将基于原始字段值(如 created 或 title_string)稳定生效,JSON:API 响应中的 data 数量与实际节点总数一致,真正实现多语言内容的统一、无偏搜索体验。











