为要投影到知识存储中的数据整形

在 Azure 认知搜索中,“为数据整形”描述了知识存储工作流中的一个步骤,该步骤可用于创建要投影到 Azure 存储中的表、对象及文件的内容的数据表示形式。

在执行技能时,输出将被写入节点层次结构中的扩充树,此时你可能想完整地查看并使用该扩充树,而更有可能的情况是,你需要更精细的粒度,为不同方案创建节点子集,如在特定表中放置与已翻译文本或已提取实体相关的节点。

就其本身而言,扩充树不包含对其内容在知识存储中的表示形式予以通知的逻辑。 数据形状将通过提供每个表、对象及文件投影中的内容的架构,来填补这一空白。 可以将数据形状视为扩充数据的自定义定义或视图。 你可根据需要创建多个形状,然后将形状分配给知识存储定义中的投影

用于创建形状的方法

可以通过以下两种方式创建扩充内容的形状,以使其可以投影到知识存储中:

  • 使用整形程序技能在扩充树中创建专门用于投影的节点。 大多数技能都会创建新内容。 而整形程序技能却相反,它通常会使用现有节点,将多个节点合并为单个复杂对象。 当你希望多个节点的输出以物理形式表现为表中的列时,这就非常有用。

  • 使用投影定义本身中的内联形状。

使用整形程序技能将形状外部化,以使其可以被多个投影甚至其他技能使用。 它还可以确保扩充树的所有突变都包含在该项技能中,且输出也是可重用的对象。 相反,内联整形可让你创建所需的形状,但它是一个匿名对象,仅适用于定义它时所针对的投影。

这些方法可以结合使用,也可以单独使用。 本文将介绍这两种方法:用于表投影的整形程序技能,以及带关键短语表投影的内联整形。

使用整形程序技能

整形程序技能通常位于技能组的末尾,可创建要传给投影的数据视图。 本示例将创建一个名为“tableprojection”的形状,其中包含以下节点:“reviews_text”、“reviews_title”、“AzureSearch_DocumentKey”以及分页审阅中的情绪评分和关键短语。

{
    "@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
    "name": "#5",
    "description": null,
    "context": "/document",
    "inputs": [        
        {
            "name": "reviews_text",
            "source": "/document/reviews_text",
            "sourceContext": null,
            "inputs": []
        },
        {
            "name": "reviews_title",
            "source": "/document/reviews_title",
            "sourceContext": null,
            "inputs": []
        },
        {
            "name": "AzureSearch_DocumentKey",
            "source": "/document/AzureSearch_DocumentKey",
            "sourceContext": null,
            "inputs": []
        },  
        {
            "name": "pages",
            "source": null,
            "sourceContext": "/document/reviews_text/pages/*",
            "inputs": [
                {
                    "name": "Sentiment",
                    "source": "/document/reviews_text/pages/*/Sentiment",
                    "sourceContext": null,
                    "inputs": []
                },
                {
                    "name": "LanguageCode",
                    "source": "/document/Language",
                    "sourceContext": null,
                    "inputs": []
                },
                {
                    "name": "Page",
                    "source": "/document/reviews_text/pages/*",
                    "sourceContext": null,
                    "inputs": []
                },
                {
                    "name": "keyphrase",
                    "sourceContext": "/document/reviews_text/pages/*/Keyphrases/*",
                    "inputs": [
                        {
                            "source": "/document/reviews_text/pages/*/Keyphrases/*",
                            "name": "Keyphrases"
                        }
                    ]
                }
            ]
        }
    ],
    "outputs": [
        {
            "name": "output",
            "targetName": "tableprojection"
        }
    ]
}

SourceContext 属性

整形程序技能中的输入可以拥有一项 sourceContext 元素。 此属性还可用于投影中的内联形状。

sourceContext 用于在扩充管道中构造多层嵌套对象。 如果输入所在的上下文与技能上下文不同,则使用 sourceContextsourceContext 要求使用寻址为源的特定元素定义嵌套的输入。

在上面的示例中,情绪分析与关键短语的提取均在拆分为数页的文本上进行,以便进行更高效的分析。 假设你想要将分数和短语投影到表中,那么现在就需要将上下文设置为提供分数及短语的嵌套输入。

将形状投影到多个表中

通过上述 outputs 部分中定义的节点 tableprojection,可以将 tableprojection 节点的各个部分切分为单个的相关表:

"projections": [
    {
        "tables": [
            {
                "tableName": "hotelReviewsDocument",
                "generatedKeyName": "Documentid",
                "source": "/document/tableprojection"
            },
            {
                "tableName": "hotelReviewsPages",
                "generatedKeyName": "Pagesid",
                "source": "/document/tableprojection/pages/*"
            },
            {
                "tableName": "hotelReviewsKeyPhrases",
                "generatedKeyName": "KeyPhrasesid",
                "source": "/document/tableprojection/pages/*/keyphrase/*"
            }
        ]
    }
]

表投影的内联形状

内联整形是在投影定义本身内创建新形状的功能。 内联整形具备以下特征:

  • 创建的形状只能由包含该形状的投影使用。
  • 创建的形状可与整形程序技能生成的形状相同。

内联形状是使用 sourceContextinputs 创建的。

属性 说明
sourceContext 设置投影的根。
inputs 每项输入都是表中的一列。 Name 为列名称。 Source 为提供数值的扩充节点。

若要投影与上一个示例相同的数据,可使用如下所示的内联投影选项:

"projections": [
    {
        "tables": [
            {
                "tableName": "hotelReviewsInlineDocument",
                "generatedKeyName": "Documentid",
                "sourceContext": "/document",     
                "inputs": [
                    {
                        "name": "reviews_text",
                        "source": "/document/reviews_text"
                    },
                    {
                        "name": "reviews_title",
                        "source": "/document/reviews_title"
                    },
                    {
                        "name": "AzureSearch_DocumentKey",
                        "source": "/document/AzureSearch_DocumentKey"
                    }                             
                ]
            },
            {
                "tableName": "hotelReviewsInlinePages",
                "generatedKeyName": "Pagesid",
                "sourceContext": "/document/reviews_text/pages/*",
                "inputs": [
                        {
                    "name": "Sentiment",
                    "source": "/document/reviews_text/pages/*/Sentiment"
                    },
                    {
                        "name": "LanguageCode",
                        "source": "/document/Language"
                    },
                    {
                        "name": "Page",
                        "source": "/document/reviews_text/pages/*"
                    }
                ]
            },
            {
                "tableName": "hotelReviewsInlineKeyPhrases",
                "generatedKeyName": "KeyPhraseId",
                "sourceContext": "/document/reviews_text/pages/*/Keyphrases/*",
                "inputs": [
                    {
                        "name": "Keyphrases",
                        "source": "/document/reviews_text/pages/*/Keyphrases/*"
                    }
                ]
            }
        ]
    }
]

使用这两种方法后,可以观察如何使用“sourceContext”来投影“Keyphrases”的值。 包含字符串集合的“Keyphrases”节点本身是页文本的子级。 但是,由于投影需要 JSON 对象并且页是基元(字符串),因此使用了“sourceContext”将关键短语包装成具有命名属性的对象。 使用此技术可以单独投影平整基元。

对象投影的内联形状

可以使用整形器技能或使用对象投影的内联整形来生成新形状。 表示例演示的是创建形状和切片的方法,而本示例演示的是内联整形的用法。

内联整形是指在投影输入的定义中创建新形状的功能。 内联整形创建一个匿名对象,该对象与整形器技能生成的对象相同(在本例中为 projectionShape)。 定义一个你不打算重复使用的形状时,内联整形非常有用。

投影属性是一个数组。 此示例将一个新的投影实例添加到数组,其中的 knowledgeStore 定义包含内联投影。 使用内联投影时,可以省略整形器技能。

"knowledgeStore" : {
    "storageConnectionString": "DefaultEndpointsProtocol=https;AccountName=<Acct Name>;AccountKey=<Acct Key>;",
    "projections": [
            {
            "tables": [ ],
            "objects": [
                {
                    "storageContainer": "sampleobject",
                    "source": null,
                    "generatedKeyName": "myobject",
                    "sourceContext": "/document",
                    "inputs": [
                        {
                            "name": "metadata_storage_name",
                            "source": "/document/metadata_storage_name"
                        },
                        {
                            "name": "metadata_storage_path",
                            "source": "/document/metadata_storage_path"
                        },
                        {
                            "name": "content",
                            "source": "/document/content"
                        },
                        {
                            "name": "keyPhrases",
                            "source": "/document/merged_content/keyphrases/*"
                        },
                        {
                            "name": "entities",
                            "source": "/document/merged_content/entities/*/name"
                        },
                        {
                            "name": "ocrText",
                            "source": "/document/normalized_images/*/text"
                        },
                        {
                            "name": "ocrLayoutText",
                            "source": "/document/normalized_images/*/layoutText"
                        }
                    ]

                }
            ],
            "files": []
        }
    ]
}

后续步骤

本文介绍了投影形状的概念和原则。 接下来,请参阅如何在表、对象和文件投影模式下应用这些内容。