
drupal 多语言站点使用 search api + solr 时,常因误启“translation filter”导致可翻译节点索引不全、搜索结果缺失或排序异常;本文详解成因、定位方法及安全修复方案。
drupal 多语言站点使用 search api + solr 时,常因误启“translation filter”导致可翻译节点索引不全、搜索结果缺失或排序异常;本文详解成因、定位方法及安全修复方案。
在 Drupal 多语言(i18n)环境中,当启用 Search API 并对接 Solr(尤其配合 JSON:API Search API 模块)进行全文检索时,一个典型且隐蔽的问题是:对同一内容实体的多语言翻译版本,搜索返回结果数量远少于实际发布节点数——例如,6 个已发布的节点(含主语言+20种翻译),空白查询却仅返回 3 条;而单独按语言或字段搜索又能正常命中。同时,排序(如按 created 或 title)也出现逻辑错乱。
该问题的根本原因通常在于 Search API 索引配置中意外启用了“Translation filter”过滤器。此过滤器默认绑定至当前用户会话语言或站点默认语言,导致索引构建或查询执行阶段主动排除非目标语言的翻译版本,从而造成:
- 索引层面:Solr 中仅存部分语言版本的文档(非全部翻译);
- 查询层面:即使索引完整,该过滤器也会在运行时动态裁剪结果集。
✅ 正确解决方案如下:
- 进入 Admin → Configuration → Search and metadata → Search API
- 找到您正在使用的 Solr 服务器对应的 索引(Index),点击 Edit
- 切换到 Filter criteria(过滤条件)标签页
- 查找名为 "Content translation" 或 "Translation filter" 的过滤项
- 取消勾选该选项(⚠️ 注意:不是禁用整个索引,而是关闭该特定过滤器)
- 保存后,务必重新索引(Re-index):点击索引页面右上角 Index now 或通过 Drush 执行
<code class="bash">drush sapi-r [index_machine_name] --user=1</code>
? 重要注意事项:
- 若您的站点需支持「按语言筛选搜索」(如前端提供语言切换器),请勿依赖此过滤器实现,而应改用 Search API 的
language字段显式过滤(例如在 JSON:API 请求中添加filter[search_api_language]=en); - 确保 Solr schema 中
language字段已正确定义为string类型并启用多值(multi-valued),以兼容 Drupal 的翻译存储逻辑; - 建议在
settings.php中显式设置config_override['language']['default']['langcode'] = 'und';(或对应默认语言码),避免系统级语言推断干扰索引一致性。
完成上述调整并完成全量重索引后,空白查询将准确返回所有已发布节点(含全部语言版本),排序行为也将严格依据字段原始值执行,彻底解决漏检与错序问题。

















