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

如何在Azure AI Search索引器中为嵌套JSON数组配置字段映射

解决Azure AI Search嵌套JSON数组字段映射问题

你当前的问题在于,索引中的message和sender字段定义为单值的Edm.String,但源数据是嵌套数组结构,且默认的索引器JSON解析模式会将整个文档作为单一索引条目,直接使用messages[].message的映射语法无法正确提取数组值。以下是两种可行的解决方案:

方案一:将数组值映射为集合类型字段(单索引条目)

该方案将整个对话作为一条索引记录,所有消息和发送者分别存入集合字段,适合需要检索整个对话上下文的场景。

步骤1:修改搜索索引

将message和sender字段类型改为Edm.Collection(Edm.String)(Azure AI Search中存储多值字符串的专用类型):

{
  "name": "conversation-index",
  "fields": [
    {"name": "datetime", "type": "Edm.String", "searchable": false, "filterable": true, "sortable": true, "facetable": false},
    {"name": "userId", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": false},
    {"name": "username", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": false},
    {"name": "message", "type": "Edm.Collection(Edm.String)", "searchable": true, "filterable": false, "sortable": false, "facetable": false},
    {"name": "sender", "type": "Edm.Collection(Edm.String)", "searchable": true, "filterable": true, "sortable": false, "facetable": false}
  ]
}

步骤2:调整索引器字段映射

移除映射路径中的[],Azure AI Search会自动将数组中的所有值收集到集合字段中:

{
  "name": "conversation-indexer",
  "dataSourceName": "conversation-datasource",
  "targetIndexName": "conversation-index",
  "schedule": { "interval": "PT1H" },
  "parameters": { "configuration": { "dataToExtract": "contentAndMetadata",  "parsingMode": "json" } },
  "fieldMappings": [
    {"sourceFieldName": "/conversation/datetime", "targetFieldName": "datetime"},
    {"sourceFieldName": "/conversation/userDetails/userId", "targetFieldName": "userId"},
    {"sourceFieldName": "/conversation/userDetails/username", "targetFieldName": "username"},
    {"sourceFieldName": "/conversation/messages/message", "targetFieldName": "message"},
    {"sourceFieldName": "/conversation/messages/sender", "targetFieldName": "sender"}
  ]
}

方案二:展开数组为独立索引条目(按消息检索)

如果需要将每条消息作为单独的索引记录(比如按单条消息内容检索),可以配置索引器展开messages数组,将数组中的每个对象作为独立文档,并映射对话级别的字段。

步骤1:修改搜索索引

保持字段为单值类型(每条索引记录对应一条消息):

{
  "name": "conversation-index",
  "fields": [
    {"name": "datetime", "type": "Edm.String", "searchable": false, "filterable": true, "sortable": true, "facetable": false},
    {"name": "userId", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": false},
    {"name": "username", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": true, "facetable": false},
    {"name": "message", "type": "Edm.String", "searchable": true, "filterable": false, "sortable": false, "facetable": false},
    {"name": "sender", "type": "Edm.String", "searchable": true, "filterable": true, "sortable": false, "facetable": false}
  ]
}

步骤2:调整索引器配置

在参数配置中指定documentRoot为数组路径,同时使用相对路径映射对话级字段:

{
  "name": "conversation-indexer",
  "dataSourceName": "conversation-datasource",
  "targetIndexName": "conversation-index",
  "schedule": { "interval": "PT1H" },
  "parameters": { 
    "configuration": { 
      "dataToExtract": "contentAndMetadata",  
      "parsingMode": "json",
      "documentRoot": "/conversation/messages" // 指定数组为文档根节点,每个数组项作为独立文档
    } 
  },
  "fieldMappings": [
    {"sourceFieldName": "../datetime", "targetFieldName": "datetime"}, // 用../引用父级conversation下的datetime
    {"sourceFieldName": "../userDetails/userId", "targetFieldName": "userId"},
    {"sourceFieldName": "../userDetails/username", "targetFieldName": "username"},
    {"sourceFieldName": "message", "targetFieldName": "message"},
    {"sourceFieldName": "sender", "targetFieldName": "sender"}
  ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 11:15:13