Azure Cognitive Search のスキルセットの概念Skillset concepts in Azure Cognitive Search

この記事は、スキルセットの概念と構成について理解を深める必要がある開発者を対象としています。ここでは、AI エンリッチメント プロセスの知識を前提としています。This article is for developers who need a deeper understanding of skillset concepts and composition, and assumes familiarity with the AI enrichment process. この概念に馴染みがない場合は、「Azure Cognitive Search における AI エンリッチメント」から初めてください。If you are new to this concept, start with AI enrichment in Azure Cognitive Search.

スキルセットの概要Introducing skillsets

スキルセットは、インデクサーにアタッチされている Azure Cognitive Search の再利用可能なリソースであり、スキルセットではインデックス作成時にテキストや画像の内容を分析、変換、および強化するために使用される一連のスキルが指定されています。A skillset is a reusable resource in Azure Cognitive Search that is attached to an indexer, and it specifies a collection of skills used for analyzing, transforming, and enriching text or image content during indexing. スキルには入力と出力があり、多くの場合、1 つのスキルの出力が、チェーンまたは一連のプロセス内の別のスキルの入力になります。Skills have inputs and outputs, and often the output of one skill becomes the input of another in a chain or sequence of processes.

スキルセットには、次の 3 つの主要なプロパティがあります。A skillset has three main properties:

  • skills は、各スキルに必要な入力に基づいてプラットフォームによって実行順序が決定される、順序付けされていないスキルのコレクションです。skills, an unordered collection of skills for which the platform determines the sequence of execution based on the inputs required for each skill.
  • cognitiveServices は、組み込みのスキルが含まれる、スキルセットの画像とテキストの処理を実行する Cognitive Services リソースのキーです。cognitiveServices, the key of a Cognitive Services resource that performs image and text processing for skillsets that include built-in skills.
  • knowledgeStore、(省略可能) エンリッチされたドキュメントがプロジェクションされる Azure ストレージ アカウントです。knowledgeStore, (optional) an Azure Storage account where your enriched documents will be projected. エンリッチされたドキュメントは、検索インデックスでも使用されます。Enriched documents are also consumed by search indexes.

スキルセットは JSON で作成します。Skillsets are authored in JSON. 次の例は、この記事の概念を示すために使用される、このホテル レビュー スキルセットの少し簡略化されたバージョンです。The following example is a slightly simplified version of this hotel-reviews skillset, used to illustrate concepts in this article.

最初の 2 つのスキルを次に示します。The first two skills are shown below:

  • スキル #1 は、"reviews_text" フィールドの内容を入力として受け取り、その内容を出力として 5,000 文字の "pages" に分割するテキスト分割スキルです。Skill #1 is a Text Split skill that accepts the contents of the "reviews_text" field as input, and splits that content into "pages" of 5000 characters as output.
  • スキル #2 は、"pages" を入力として受け入れ、センチメント分析の結果が含まれる "Sentiment" という名前の新しいフィールドを作成するセンチメント検出スキルです。Skill #2 is a Sentiment Detection skill accepts "pages" as input, and produces a new field called "Sentiment" as output that contains the results of sentiment analysis.
{
    "skills": [
        {
            "@odata.type": "#Microsoft.Skills.Text.SplitSkill",
            "name": "#1",
            "description": null,
            "context": "/document/reviews_text",
            "defaultLanguageCode": "en",
            "textSplitMode": "pages",
            "maximumPageLength": 5000,
            "inputs": [
                {
                    "name": "text",
                    "source": "/document/reviews_text"
                }
            ],
            "outputs": [
                {
                    "name": "textItems",
                    "targetName": "pages"
                }
            ]
        },
        {
            "@odata.type": "#Microsoft.Skills.Text.SentimentSkill",
            "name": "#2",
            "description": null,
            "context": "/document/reviews_text/pages/*",
            "defaultLanguageCode": "en",
            "inputs": [
                {
                    "name": "text",
                    "source": "/document/reviews_text/pages/*",
                }
            ],
            "outputs": [
                {
                    "name": "score",
                    "targetName": "Sentiment"
                }
            ]
        },
  "cognitiveServices": null,
  "knowledgeStore": {  }
}

注意

条件付きスキルを使用して式を作成することにより、ループや分岐が含まれる複雑なスキルセットを構築できます。You can build complex skillsets with looping and branching, using the Conditional skill to create the expressions. 構文では、いくつかの修正が加えられた JSON ポインター パス表記を使用して、強化ツリー内のノードを識別します。The syntax is based on the JSON Pointer path notation, with a few modifications to identify nodes in the enrichment tree. "/" ではツリー内の下位レベルが走査され、"*" はコンテキストでの for-each 演算子として機能します。A "/" traverses a level lower in the tree and "*" acts as a for-each operator in the context. この記事の多くの例は、この構文を示しています。Numerous examples in this article illustrate the syntax.

強化ツリーEnrichment tree

エンリッチメント パイプラインの手順の進行中、コンテンツ処理はテキストと画像がソースから抽出される ドキュメント解析 フェーズに従います。In the progression of steps in an enrichment pipeline, content processing follows the document cracking phase where text and images are extracted from the source. 画像コンテンツは画像処理を指定するスキルにルーティングされ、テキスト コンテンツはテキスト処理のためキューに登録されます。Image content can then be routed to skills that specify image processing, while text content is queued for text processing. 大量のテキストが含まれているソース ドキュメントの場合は、インデクサーで 解析モード を設定して、より最適な処理を行えるようテキストをより小さなチャンクに分割することができます。For source documents that contain large quantities of text, you can set a parsing mode on the indexer to segment text into smaller chunks for more optimal processing.

パイプラインにおけるナレッジ ストアの図Knowledge store in pipeline diagram

強化パイプラインに入ったドキュメントは、コンテンツおよび関連付けられている強化のツリーとして表されます。Once a document is in the enrichment pipeline, it is represented as a tree of content and associated enrichments. このツリーは、ドキュメント解析の出力としてインスタンス化されます。This tree is instantiated as the output of document cracking. 強化ツリー形式により、強化パイプラインではメタデータをプリミティブ データ型にもアタッチできます。これは有効な JSON オブジェクトではありませんが、有効な JSON 形式に射影できます。The enrichment tree format enables the enrichment pipeline to attach metadata to even primitive data types, it is not a valid JSON object but can be projected into a valid JSON format. 次の表では、強化パイプラインに入ったドキュメントの状態を示します。The following table shows the state of a document entering into the enrichment pipeline:

データ ソース/解析モードData Source\Parsing Mode DefaultDefault JSON、JSON 行、CSVJSON, JSON Lines & CSV
Blob StorageBlob Storage /document/content/document/content
/document/normalized_images/*/document/normalized_images/*
/document/{key1}/document/{key1}
/document/{key2}/document/{key2}
SQLSQL /document/{column1}/document/{column1}
/document/{column2}/document/{column2}
該当なしN/A
Cosmos DBCosmos DB /document/{key1}/document/{key1}
/document/{key2}/document/{key2}
該当なしN/A

実行されたスキルによって、強化ツリーに新しいノードが追加されます。As skills execute, they add new nodes to the enrichment tree. これらの新しいノードは、ダウンストリームのスキル、ナレッジ ストアへの射影、またはインデックス フィールドへのマッピングに対する入力として使用できます。These new nodes may then be used as inputs for downstream skills, projecting to the knowledge store, or mapping to index fields. 強化は変更できません。作成されたノードを編集することはできません。Enrichments aren't mutable: once created, nodes cannot be edited. スキルセットや強化ツリーの複雑さが増しても、強化ツリー内のすべてのノードをインデックスやナレッジ ストアにする必要はありません。As your skillsets get more complex, so will your enrichment tree, but not all nodes in the enrichment tree need to make it to the index or the knowledge store.

強化のサブセットのみを選択して、インデックスまたはナレッジ ストアに保存することができます。You can selectively persist only a subset of the enrichments to the index or the knowledge store.

ContextContext

各スキルにはコンテキストが必要です。Each skill requires a context. コンテキストによって次のことが決まります。A context determines:

  • 選択されたノードに基づいて、スキルが実行される回数。The number of times the skill executes, based on the nodes selected. 型コレクションのコンテキスト値の場合、末尾に /* を追加すると、コレクション内のインスタンスごとにスキルが 1 回呼び出されます。For context values of type collection, adding an /* at the end will result in the skill being invoked once for each instance in the collection.

  • スキルの出力が追加される強化ツリー内の場所。Where in the enrichment tree the skill outputs are added. 出力は、常にコンテキスト ノードの子としてツリーに追加されます。Outputs are always added to the tree as children of the context node.

  • 入力の形状。Shape of the inputs. 複数レベルのコレクションの場合、コンテキストを親コレクションに設定すると、スキル入力の形状に影響します。For multi level collections, setting the context to the parent collection will affect the shape of the input for the skill. たとえば、国または地域のリストが含まれる強化ツリーがあり、それぞれが郵便番号のリストを含む州のリストでエンリッチメント処理されている場合、次のようになります。For example if you have an enrichment tree with a list of countries/regions, each enriched with a list of states containing a list of ZIP codes.

ContextContext 入力Input 入力の形状Shape of Input スキルの呼び出しSkill Invocation
/document/countries/* /document/countries/*/states/*/zipcodes/* 国または地域のすべての郵便番号のリストA list of all ZIP codes in the country/region 国または地域ごとに 1 回Once per country/region
/document/countries/*/states/* `/document/countries/ /states/ /zipcodes/*```/document/countries//states//zipcodes/*`` 州内の郵便番号のリストA list of ZIP codes in the state 国または地域と州の組み合わせごとに 1 回Once per combination of country/region and state

強化データを生成するGenerate enriched data

ホテル レビュー スキルセットを参照ポイントとして使用し、以下を見ていきます。Using the hotel reviews skillset as a reference point, we are going to look at:

  • 各スキルの実行によって強化ツリーがどのように発展するかHow the enrichment tree evolves with the execution of each skill
  • スキルの実行回数の決定に対してコンテキストと入力がどのように働くかHow the context and inputs work to determine how many times a skill executes
  • コンテキストに基づく入力の形状What the shape of the input is based on the context

エンリッチメント プロセス内の "ドキュメント" は、hotel_reviews.csv のソース ファイル内の 1 つの行 (ホテルのレビュー) を表します。A "document" within the enrichment process represents a single row (a hotel review) within the hotel_reviews.csv source file.

スキル #1: 分割スキルSkill #1: Split skill

ソース コンテンツが大量のテキストで構成されている場合は、言語、センチメント、キーフレーズ検出の精度を高めるために、より小さいコンポーネントに分割すると便利です。When source content consists of large chunks of text, it's helpful to break it into smaller components for greater accuracy of language, sentiment, and key phrase detection. 使用できるグレインは、ページと文の 2 つです。There are two grains available: pages and sentences. ページは約 5,000 文字で構成されます。A page consists of approximately 5000 characters.

通常、テキスト分割スキルは、スキルセットにおいて最初に選ばれます。A text split skill is typically first in a skillset.

      "@odata.type": "#Microsoft.Skills.Text.SplitSkill",
      "name": "#1",
      "description": null,
      "context": "/document/reviews_text",
      "defaultLanguageCode": "en",
      "textSplitMode": "pages",
      "maximumPageLength": 5000,
      "inputs": [
        {
          "name": "text",
          "source": "/document/reviews_text"
        }
      ],
      "outputs": [
        {
          "name": "textItems",
          "targetName": "pages"
        }

"/document/reviews_text" のスキル コンテキストでは、この分割スキルは reviews_text に対して 1 回実行されます。With the skill context of "/document/reviews_text", the split skill will execute once for the reviews_text. スキルの出力はリストであり、reviews_text が 5000 文字のセグメントに分割されています。The skill output is a list where the reviews_text is chunked into 5000 character segments. 分割スキルからの出力は pages という名前で、これは強化ツリーに追加されます。The output from the split skill is named pages and it is added to the enrichment tree. targetName 機能を使用することで、強化ツリーに追加される前に、スキル出力の名前を変更できます。The targetName feature allows you to rename a skill output before being added to the enrichment tree.

これで、強化ツリーのスキルのコンテキストの下に、新しいノードが配置されました。The enrichment tree now has a new node placed under the context of the skill. このノードは、任意のスキル、プロジェクション、または出力フィールド マッピングで使用できます。This node is available to any skill, projection, or output field mapping. 概念的には、ツリーは次のようになります。Conceptually, the tree looks as follows:

ドキュメント解析後の強化ツリーenrichment tree after document cracking

すべての強化のルート ノードは "/document" です。The root node for all enrichments is "/document". BLOB インデクサーを使用すると、"/document" ノードに子ノード "/document/normalized_images""/document/content" ができます。When working with blob indexers, the "/document" node will have child nodes of "/document/content" and "/document/normalized_images". この例のように、CSV データを使用すると、列名は "/document" の下のノードにマップされます。When working with CSV data, as we are in this example, the column names will map to nodes beneath "/document".

スキルによってノードに追加されたいずれかの強化にアクセスするには、強化の完全なパスが必要です。To access any of the enrichments added to a node by a skill, the full path for the enrichment is needed. たとえば、pages ノードのテキストを別のスキルへの入力として使用する場合は、"/document/reviews_text/pages/*" として指定する必要があります。For example, if you want to use the text from the pages node as an input to another skill, you will need to specify it as "/document/reviews_text/pages/*".

スキル #1 の後の強化ツリーenrichment tree after skill #1

スキル #2: 言語検出Skill #2 Language detection

ホテル レビュー ドキュメントには、複数の言語で表される顧客フィードバックが含まれています。Hotel review documents include customer feedback expressed in multiple languages. 言語検出スキルによって、どの言語が使用されているか判断されます。The language detection skill determines which language is used. 結果は、キー フレーズ抽出とセンチメント検出に渡され、センチメントと語句を検出する際に言語が考慮されます。The result is then passed to key phrase extraction and sentiment detection, taking language into consideration when detecting sentiment and phrases.

言語検出スキルは、スキルセットで定義されている 3 番目のスキルですが (スキル #3)、次に実行されるスキルです。While the language detection skill is the third (skill #3) skill defined in the skillset, it is the next skill to execute. 入力要求によってブロックされないため、前のスキルと並列に実行されます。Since it is not blocked by requiring any inputs, it will execute in parallel with the previous skill. 先行する分割スキルと同様に、言語検出スキルもドキュメントごとに 1 回呼び出されます。Like the split skill that preceded it, the language detection skill is also invoked once for each document. 強化ツリーには言語用の新しいノードが追加されています。The enrichment tree now has a new node for language.

スキル #2 の後の強化ツリーenrichment tree after skill #2

スキル #3: キー フレーズ スキルSkill #3: Key phrases skill

コンテキストとして /document/reviews_text/pages/* が指定されたキー フレーズ スキルは、pages コレクションの各項目に対して 1 回ずつ呼び出されます。Given the context of /document/reviews_text/pages/* the key phrases skill will be invoked once for each of the items in the pages collection. スキルからの出力は、関連付けられている page 要素の下のノードになります。The output from the skill will be a node under the associated page element.

スキルセットに含まれる残りのスキルを表示し、各スキルの実行によって強化のツリーがどのように成長し続けるかを視覚化できるようになるはずです。You should now be able to look at the rest of the skills in the skillset and visualize how the tree of enrichments will continue to grow with the execution of each skill. マージ スキルや Shaper スキルなどの一部のスキルでも新しいノードが作成されますが、既存のノードのデータのみが使用され、新しい強化は作成されません。Some skills, such as the merge skill and the shaper skill, also create new nodes but only use data from existing nodes and don't create net new enrichments.

すべてのスキルの後の強化ツリーenrichment tree after all skills

上のツリーのコネクタの色は、強化が異なるスキルで作成されたことを示しています。ノードは個別に指定する必要があり、親ノードを選択したときに返されるオブジェクトの一部にはなりません。The colors of the connectors in the tree above indicate that the enrichments were created by different skills and the nodes will need to be addressed individually and will not be part of the object returned when selecting the parent node.

エンリッチメントの保存Save enrichments

Azure Cognitive Search では、インデクサーによって作成された出力が保存されます。In Azure Cognitive Search, an indexer saves the output it creates. 出力の 1 つは、常に検索可能なインデックスになります。One of the outputs is always a searchable index. インデックスの指定は必須であり、スキルセットをアタッチすると、インデックスによって取り込まれたデータにはエンリッチメントの内容が含まれます。Specifying an index is a requirement, and when you attach a skillset, the data ingested by an index includes the substance of the enrichments. 通常、キー フレーズやセンチメント スコアなどの特定のスキルの出力は、その目的のために作成されたフィールドのインデックスに取り込まれます。Usually, the outputs of specific skills, such as key phrases or sentiment scores, are ingested into the index in a field created for that purpose.

必要に応じて、インデクサーから他のツールやプロセスで使用するためにナレッジ ストアに出力を送信することもできます。Optionally, an indexer can also send the output to a knowledge store for consumption in other tools or processes. ナレッジ ストアは、スキルセットの一部として定義されます。A knowledge store is defined as part of the skillset. この定義により、エンリッチされたドキュメントがテーブルまたはオブジェクト (ファイルまたは BLOB) として投影されるかどうかが決まります。It's definition determines whether your enriched documents are projected as tables or objects (files or blobs). 表形式のプロジェクションは、Power BI などのツールでの対話型分析に適しています。一方、ファイルと BLOB は通常、データ サイエンスや同様のプロセスで使用されます。Tabular projections are well-suited for interactive analysis in tools like Power BI, whereas files and blobs are typically used in data science or similar processes. このセクションでは、スキルセットの合成によって、プロジェクションするテーブルまたはオブジェクトがどのように整形されるかについて説明します。In this section, you'll learn how skillset composition can shape the tables or objects you want to project.

プロジェクションProjections

ナレッジ ストアを対象とするコンテンツについては、コンテンツをどのように構造化するかを検討する必要があります。For content that targets a knowledge store, you will want to consider how the content is structured. プロジェクション とは、強化ツリーからノードを選択し、ナレッジ ストアにそのノードの物理的な表現を作成するプロセスです。Projection is the process of selecting the nodes from the enrichment tree and creating a physical expression of them in the knowledge store. プロジェクションとは、テーブルのプロジェクションまたはオブジェクトのプロジェクションとして出力できるドキュメント (コンテンツと強化) のカスタム形状です。Projections are custom shapes of the document (content and enrichments) that can be output as either table or object projections. プロジェクションの使用について詳しくは、プロジェクションの操作に関する記事をご覧ください。To learn more about working with projections, see working with projections.

フィールド マッピング オプションField mapping options

SourceContextSourceContext

sourceContext 要素は、スキルの入力とプロジェクションでのみ使用されます。The sourceContext element is only used in skill inputs and projections. それは、複数レベルの入れ子になったオブジェクトを構築するために使用されます。It is used to construct multi-level, nested objects. 場合によっては、新しいオブジェクトを作成して、それをスキルまたはプロジェクトへの入力としてナレッジストアに渡す必要があります。You may need to create a new object to either pass it as an input to a skill or project into the knowledge store. エンリッチメント ノードは、エンリッチメント ツリー内の有効な JSON オブジェクトではない可能性があり、ツリー内のノードを参照すると、作成時のノードの状態のみが返されるため、エンリッチメントをスキル入力またはプロジェクションとして使用するには、適切な形式の JSON オブジェクトを作成する必要があります。As enrichment nodes may not be a valid JSON object in the enrichment tree and referencing a node in the tree only returns that state of the node when it was created, using the enrichments as skill inputs or projections requires you to create a well formed JSON object. sourceContext を使用すると、階層型の匿名型オブジェクトを構築でき、コンテキストを使用する場合にのみ、複数のスキルが必要になります。The sourceContext enables you to construct a hierarchical, anonymous type object, which would require multiple skills if you were only using the context.

次の例では、sourceContext の使用方法を示しています。Using sourceContext is shown in the following examples. エンリッチメントを生成したスキル出力を調べて、それがプリミティブ型ではなく有効な JSON オブジェクトであるかを確認します。Look at the skill output that generated an enrichment to determine if it is a valid JSON object and not a primitive type.

プロジェクションのスライスSlicing projections

テーブル プロジェクション グループを定義するときに、強化ツリー内の 1 つのノードを複数の関連テーブルにスライスできます。When defining a table projection group, a single node in the enrichment tree can be sliced into multiple related tables. 既存のテーブル プロジェクションの子であるソース パスを含むテーブルを追加した場合、結果の子ノードは既存のテーブル プロジェクションの子にはならず、代わりに新しい関連テーブルに射影されます。If you add a table with a source path that is a child of an existing table projection, the resulting child node will not be a child of the existing table projection, but instead will be projected into the new, related, table. このスライス技法を使用すると、すべてのテーブル プロジェクションのソースとして使用できる 1 つのノードを Shaper スキルで定義できます。This slicing technique allows you to define a single node in a shaper skill that can be the source for all your table projections.

プロジェクションの整形Shaping projections

プロジェクションを定義するには 2 つの方法があります。There are two ways to define a projection:

  • Text Shaper スキルを使用して、プロジェクションするすべてのエンリッチメントのルート ノードである新しいノードを作成します。Use the Text Shaper skill to create a new node that is the root node for all the enrichments you are projecting. その後、プロジェクションでは、Shaper スキルの出力のみを参照します。Then, in your projections, you would only reference the output of the shaper skill.

  • プロジェクション定義自体の中にあるプロジェクションでインライン整形を使用します。Use an inline shape a projection within the projection definition itself.

Shaper による方法は、インライン整形より手間がかかりますが、強化ツリーのすべての変更がスキル内に含まれ、出力が再利用できるオブジェクトになることが保証されます。The shaper approach is more verbose than inline shaping but ensures that all the mutations of the enrichment tree are contained within the skills and that the output is an object that can be reused. 一方でインライン整形では、必要な形状を作成できますが、匿名オブジェクトであり、定義されているプロジェクションでのみ使用できます。In contrast, inline shaping allows you to create the shape you need, but is an anonymous object and is only available to the projection for which it is defined. これらの方法は、組み合わせて使用することも、個別に使用することもできます。The approaches can be used together or separately. ポータル ワークフローで自動的に作成されるスキルセットには、両方が含まれています。The skillset created for you in the portal workflow contains both. テーブル プロジェクションに対しては Shaper スキルが使用されていますが、キー フレーズ テーブルの射影にはインライン整形も使用されます。It uses a shaper skill for the table projections, but also uses inline shaping to project the key phrases table.

この例を拡張するには、インライン整形を削除し、Shaper スキルを使用してキー フレーズ用の新しいノードを作成することができます。To extend the example, you could choose to remove the inline shaping and use a shaper skill to create a new node for the key phrases. 以下のセクションでは、3 つのテーブル hotelReviewsDocumenthotelReviewsPageshotelReviewsKeyPhrases に射影される形状を作成する 2 つのオプションについて説明します。To create a shape projected into three tables, namely, hotelReviewsDocument, hotelReviewsPages, and hotelReviewsKeyPhrases, the two options are described in the following sections.

Shaper スキルとプロジェクションShaper skill and projection

注意

簡潔にするため、この例ではドキュメント テーブルの一部の列が削除されています。Some of the columns from the document table have been removed from this example for brevity.

{
    "@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": "SentimentScore",
                    "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"
        }
    ]
}

上の outputs セクションで定義されている tableprojection ノードでは、スライス機能を使用して、tableprojection ノードの部分を別のテーブルに射影できます。With the tableprojection node defined in the outputs section above, we can now use the slicing feature to project parts of the tableprojection node into different tables:

注意

これは、ナレッジ ストア構成内のプロジェクションのスニペットにすぎません。This is only a snippet of the projection within the knowledge store configuration.

"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/*"
            }
        ]
    }
]

プロジェクションのインライン整形Inline shaping projections

インライン整形方式では、プロジェクションに必要なすべての形状は必要になった時点で作成されるため、Shaper スキルは必要ありません。The inline shaping approach does not require a shaper skill as all shapes needed for the projections are created at the time they are needed. 前の例と同じデータを射影するためのインライン プロジェクション オプションは次のようになります。To project the same data as the previous example, the inline projection option would look like this:

"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": "SentimentScore",
                    "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/*"
                    }
                ]
            }
        ]
    }
]

両方の方法から観察されることの 1 つは、"sourceContext" を使用して "Keyphrases" の値が射影される方法です。One observation from both the approaches is how values of "Keyphrases" are projected using the "sourceContext". 文字列のコレクションが含まれる "Keyphrases" ノードは、それ自体がページ テキストの子になります。The "Keyphrases" node, which contains a collection of strings, is itself a child of the page text. ただし、プロジェクションには JSON オブジェクトが必要であり、ページはプリミティブ (文字列) であるため、"sourceContext" を使用して、キー フレーズを名前付きプロパティを持つオブジェクトにラップします。However, because projections require a JSON object and the page is a primitive (string), the "sourceContext" is used to wrap the key phrase into an object with a named property. この手法を使用すると、プリミティブであっても個別に射影できます。This technique enables even primitives to be projected independently.

次のステップNext steps

次のステップでは、コグニティブ スキルを使用して最初のスキルセットを作成します。As a next step, create your first skillset with cognitive skills.