You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Search无法映射复杂对象集合问题求助

Azure Cognitive Search 从Azure SQL导入复杂类型数据的报错解决

问题背景

使用Azure Search .NET SDK从Azure SQL Database导入数据,数据库视图返回的JSON结构如下:

[
    {
        "AttributeId": 133,
        "Value": "07.02.2023",
        "Attribute": [
            {
                "Id": 133,
                "Name": "Date",
                "DataTypeId": 4
            }
        ]
    },
    {
        "AttributeId": 141,
        "Value": "28.01.2023 06:59",
        "Attribute": [
            {
                "Id": 141,
                "Name": "Inspection date",
                "DataTypeId": 5
            }
        ]
    }
]

对应的.NET映射模型:

public class Entity {
   ...
   public List<Assignment>? Assignments { get; set; }
}

public class Assignment
{
    public int AttributeId { get; set; }

    public string Value { get; set; }

    public Attribute Attribute { get; set; }
}

public class Attribute
{
    public int Id { get; set; }

    public string Name { get; set; }

    public int DataTypeId { get; set; }
}

运行索引器时触发报错:

JSON arrays with element type 'Object' map to Collection(Edm.ComplexType)'). The expected type was 'Edm.ComplexType'

补充:Azure SQL Database无原生对应Azure Cognitive Search的Collection(Edm.String)类型,内置字段映射函数仅提供jsonArrayToStringCollection,缺少处理复杂类型集合的函数。

报错原因

数据库返回的Attribute字段是JSON数组格式,但.NET模型中Assignment类的Attribute属性是单个复杂对象,Azure Cognitive Search索引器期望接收Edm.ComplexType类型,但实际收到的是数组(应对应Collection(Edm.ComplexType)),类型不匹配导致报错。

可行解决方案

方案1:修改SQL视图,将数组转为单个对象

在SQL查询中提取数组的第一个元素,把Attribute字段从数组格式改为单个对象,匹配模型定义:

SELECT 
    AttributeId,
    Value,
    -- 提取数组第一个元素作为单个对象
    JSON_QUERY(Attribute, '$[0]') AS Attribute
FROM your_target_view

修改后视图返回的Attribute为单个JSON对象,索引器可直接映射到模型中的Attribute属性。

方案2:调整模型与索引结构,适配数组类型

如果业务允许,将模型中的Attribute改为集合类型,同时同步修改Search索引的字段定义:

  1. 修改.NET模型:
public class Assignment
{
    public int AttributeId { get; set; }
    public string Value { get; set; }
    // 改为集合类型,匹配数据库返回的数组
    public List<Attribute>? Attribute { get; set; }
}
  1. 在Azure Cognitive Search索引定义中,将Attribute字段的类型设置为Collection(Edm.ComplexType),并配置其包含的子字段(Id、Name、DataTypeId)。

方案3:自定义技能处理数组转单个对象

若无法修改SQL或模型,可通过Azure Function实现自定义技能,将Attribute数组提取第一个元素转为单个对象,再在索引器的字段映射中使用该技能的输出结果:

  • 编写Azure Function,接收JSON数组输入,返回数组的第一个元素;
  • 在索引器中添加该自定义技能,配置输入为Attribute字段;
  • 调整字段映射,将Assignment.Attribute指向自定义技能的输出。

内容的提问来源于stack exchange,提问作者Sergiu Molnar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:00:45