如何在天蓝色搜索中对复杂的json对象进行字段映射,例如嵌套数组

时间:2018-01-08 13:44:53

标签: azure azure-search

我有以下问题 我有一个字段映射更新到索引.Payload是复杂的地方 我有:

{
    "type": "abc",
    "Party": [{
        "Type": "abc",
        "Id": "123",
        "Name": "manasa",
        "Phone": [{
            "Type": "Office",
            "Number": "12345"
        }]
    }]
}

现在我想为索引创建一个字段。字段名称是Collection(Edm.String)类型的语音 其中映射是

{
"sourceFieldName" : "/Party/Phone/Number",
"targetFieldName" : "phonenumber",
"mappingFunction" : { "name" : "jsonArrayToStringCollection" }
}

在http帖子中 但仍然在索引之后我得到的电话号码结果为null。这意味着映射出错了。如果你在源json中看到电话号码,它就在json数组中,它本身就是一个数组,结果需要存储在一个集合中一个字符串。我有可能实现这个目标吗? 如果这是不可能的,我至少想要字段映射,直到电话阵列即。,/ Party / Phone /

如果我将完整的聚会数组索引为文本,则在运行索引时会出现错误:

"Field 'partydetails' contains a term that is too large to process. The max length for UTF-8 encoded terms is 32766 bytes. The most likely cause of this error is that filtering, sorting, and/or faceting are enabled on this field, which causes the entire field value to be indexed as a single term. Please avoid the use of these options for large fields."

有人可以帮忙!

2 个答案:

答案 0 :(得分:1)

请注意,Party和Phone是数组,因此您提到的字段映射无法正常工作。

您需要索引特定元素。例如:

{
    "sourceFieldName": "/Party/0/Phone/0/Type",
    "targetFieldName": "firstPhoneNumberTypeOfFirstParty"
}

你可能想要一试。

谢谢!

Luis Cabrera |项目经理| Azure搜索

答案 1 :(得分:1)

如果聚会是一个Json对象而不是一个数组而手机只是一个字符串数组,例如

{
    "type": "abc",
    "Party": {
        "Type": "abc",
        "Id": "123",
        "Name": "manasa",
        "Phone": [{
            "12345",
            "23463"
        }]
    }
}

然后我可以映射

{
    "sourceFieldName" : "Party/Phonenumber",
    "targetFieldName" : "phonenumbers",
    "mappingFunction" : { "name" : "jsonArrayToStringCollection" }
}

它映射为odata EDM.string类型的集合。

所以要以更好,更直接的方式,

  1. 将你的json变成更平坦的东西(我的例子 上面给出了)或
  2. 如果您在吸入之前知道,请使用正确的索引     @Luis Cabrera说,

        “sourceFieldName”: “/Party/0/Phone/0/Type
    
  3. 这是天蓝色搜索方面的限制。