Laravel使用elasticsearch-php做nested查询时categories报非nested类型错误
排查步骤
1. 校验索引mapping定义的层级是否正确
绝大多数该问题都是nested类型的定义层级错误导致的,确认迁移文件中categories字段的type: nested是定义在字段的顶层,而非properties内部。
错误示例
'categories' => [ 'properties' => [ 'type' => 'nested', // 此处定义位置错误 'name' => [ 'type' => 'text' ], 'id' => [ 'type' => 'integer' ] ] ]
正确示例
// 原生elasticsearch-php写法 $client->indices()->create([ 'index' => 'product_index', 'body' => [ 'mappings' => [ 'properties' => [ // 其他字段定义省略 'categories' => [ 'type' => 'nested', // 必须在categories字段的第一层定义 'properties' => [ 'name' => ['type' => 'text'], 'id' => ['type' => 'integer'] ] ] ] ] ] ]);
如果使用laravel/scout相关ES扩展,也需要遵循相同的层级规则配置mapping。
2. 确认迁移修改已实际生效
修改完迁移文件后仅执行数据导入不会更新已有索引的mapping,需要完全重建索引:
- 查看当前索引的真实mapping,确认结构是否符合预期:
curl -XGET "http://你的ES服务地址/产品索引名/_mapping?pretty" - 删除现有错误索引:
curl -XDELETE "http://你的ES服务地址/产品索引名" - 重新执行索引创建逻辑,再全量同步产品数据
3. 排查自动创建索引的逻辑冲突
如果ES集群开启了action.auto_create_index配置,或者项目中存在索引不存在时自动创建的逻辑,可能会优先生成默认结构的索引,覆盖自定义的nested配置。可以临时关闭自动创建索引,手动执行索引创建逻辑确认mapping正确后再开启数据同步。
解决流程
- 修正迁移文件中categories字段的层级定义,保证
type: nested在字段最外层 - 删除现有错误的产品索引
- 重新执行索引创建,生成正确mapping的新索引
- 全量同步产品数据到新索引
- 调用mapping查询接口确认categories字段已标记为nested类型,再测试nested查询
内容的提问来源于stack exchange,提问作者Karim Pazoki
相关产品推荐
相关产品推荐

