---
title: "ウォークスルー:新たな次元での報告"
slug: "walkthrough--reporting-on-a-new-dimension"
abstract: "新しい次元をどのように作成し、使用するかを説明します。これは時に柔軟な次元とも呼ばれます。"
---
# ウォークスルー:新たな次元での報告

Sitecoreには複数の次元があり、それぞれが報告されています。もしSitecoreが報告しない次元について報告したい場合は、独自の次元を作成してその指標を収集できます。

> !注このトピックでは、Sitecore 9以降でフレ *キシブルディメン*ションとも呼ばれる次元をどのように実装するかを説明します。

このウォークスルーでは、以下の方法を説明します:

-   次元とメトリクスのクラスを作成します。次元を表現し、メトリクスの計算を行うクラスを作成します。
-   レポーティングデータベースを更新します - レポーティングデータベースを更新してディメンションデータをそこに保存します。
-   次元とメトリクスの項目を作成する - Sitecoreの項目はその次元とその指標を表します。
-   新しい次元を設定する - Sitecoreがその次元を使うように設定します。

新しい次元を作成・設定した後、[データを表示するチャートを追加](https://doc.sitecore.com/xp/en/developers/100/sitecore-experience-manager/walkthrough--adding-a-bar-chart-to-an-experience-analytics-report.html)できます。

## 次元と指標用のクラスを作成する

以下の手順は、新しい次元を実装し、メトリクスを計算するクラスの作成方法を示しています。

### 参考文献の追加

Visual Studioのソリューションでこれらのライブラリへの参照を追加してください:

Sitecore.Analytics.Aggregation
Sitecore.ExperienceAnalytics.Aggregation
Sitecore.XConnect
Sitecore.Kernel
Sitecore.XConnect.Collection.Model

### モデルを定義する

次元と計量のモデルを作成するために:

1.  DictionaryValueクラスとIMergeableMetric<TableName>インターフェースを拡張するクラスを作成します。これらのクラスの命名規則は*、例えば Metrics* PostCodeMetrics、OutcomeMetrics、などです。
2.  指標のプロパティを定義します。例えば Visits、 MonetaryValue、などです。
3.  MergeWithメソッドを実装します。このメソッドでは、新しい相互作用で計算されたデータをどのように既存の計算データにマージするかを指定します。

以下の例は、エンゲージメント値と訪問のバウンスを収集するBrowserという次元の実装を示しています。

class BrowserMetrics : DictionaryValue, IMergeableMetric<BrowserMetrics>
 {
 public int Visits { get; set; }
 public int EngagementValue { get; set; }
 public int Bounces { get; set; }

 public T MergeWith<T>(T other) where T : BrowserMetrics, new()
 {
 if (other == null)
 {
 throw new ArgumentNullException(nameof(other));
 }

 return new T
 {
 Visits = Visits + other.Visits,
 Bounces = Bounces + other.Bounces,
 EngagementValue = other.EngagementValue
 };
 }
 }

> !注クラス名とメトリクスプロパティは、後のタスクでデータベーススキーマを定義します。

### グループリゾルバを作成する

次元をグループ化するために使うキーの解決戦略を定義しなければなりません。例えば、*URL*、*Goal*、または*Outcome*です。これはグループリゾルバを実装することで行います。

グループリゾルバを作成するには:

1.  IGroupResolver<T>インターフェースを拡張する新しいクラスを作成し、Tは次元ごとにレコードをグループ化する際にキーとして使いたいタイプのオブジェクトです。
2.  MeasureGroupOccurrencesメソッドを実装しましょう。

以下の例では、群を分解するためにBrowserData型を用いて、*Browser*の指標を測定しています。

class BrowserResolver : IGroupResolver<BrowserData>
 {
 public IEnumerable<VisitGroupMeasurement<BrowserData>> MeasureGroupOccurrences(IInteractionAggregationContext context)
 {
 if (context == null)
 {
 throw new ArgumentNullException(nameof(context));
 }

 var browserData = context.Interaction.WebVisit()?.Browser;
 var occurrences = new List<VisitGroupMeasurement<BrowserData>>();

 if (browserData != null)
 {
 var serializedBrowserDataKey = JsonConvert.SerializeObject(browserData, new JsonSerializerSettings
 {
 TypeNameHandling = TypeNameHandling.All
 });

 occurrences.Add(new VisitGroupMeasurement<BrowserData>(new VisitGroup(serializedBrowserDataKey), new { browserData }));
 return occurrences;
 }

 return occurrences;
 }
 }

BrowserData JSONがメトリクスのキーとして使うには大きすぎる場合があり、不要な情報が多く含まれている場合があります。正しい情報をキーとして使うには、キーリゾルバを使う必要があります。

キーリゾルバを作成するには:

-   IVisitGroupKeyResolver<String>インターフェースを拡張するクラスを作成してください:
    
    class BrowserKeyResolver: IVisitGroupKeyResolver<string>
     {
     public IEnumerable<string> GetKeys(IVisitGroup visitGroup)
     {
     if (visitGroup == null)
     {
     throw new ArgumentNullException(nameof(visitGroup));
     }
    
     var browserDataKey = JsonConvert.DeserializeObject<BrowserData>(visitGroup.Id, new JsonSerializerSettings
     {
     TypeNameHandling = TypeNameHandling.All
     });
    
     return new List<string>
     {
     browserDataKey.BrowserMinorName}
     };
     }
     }
    
    > !注VisitGroup IDにGuidやstringを使うと、そのBrowserKeyResolverは任意になります。
    

### 事実計算機を作成する

ファクト計算機を作成する必要があります。これは、この次元でモデルで定義された個々の指標の値を計算するクラスです。例えば、ページビュー数、直出率などです。

事実計算機を作成するために:

1.  IFactCalculator<out TValue, TGroup>インターフェースを拡張するクラスを作成し、TValueは最初に作成したクラスの型、TGroupは作成したIGroupResolverクラスのグループ型です。
2.  CalculateFactsForGroupメソッドを導入してください。このメソッドは特定のグループごとに個別の指標を計算します。

以下の例は、総エンゲージメント数、訪問数、訪問中に発生したバウンド数を測定しています。

class BrowserFactCalculator : IFactCalculator<BrowserMetrics, BrowserData>
 {
 public BrowserMetrics CalculateFactsForGroup(VisitGroupMeasurement<BrowserData> groupMeasurement, IInteractionAggregationContext context)
 {
 if (groupMeasurement == null)
 {
 throw new ArgumentNullException(nameof(groupMeasurement));
 }
 if (context == null)
 {
 throw new ArgumentNullException(nameof(context));
 }

 var pageViewEvents = context.Interaction.Events.OfType<PageViewEvent>().ToList();

 return new BrowserMetrics
 {
 Bounces = pageViewEvents.Count == 1 ? 1 : 0,
 EngagementValue = context.Interaction.EngagementValue,
 Visits = 1
 };
 }
 }

### 親キーリゾルバを作成する

このステップは任意です。もし階層的な性質を持つ一連の次元、例えば多くの結果を含むアウトカムグループがある場合、親キーリゾルバを実装して階層内の関係を表現できます。

親キーリゾルバを作成するには:

-   IVisitGroupKeyResolver<GUID>またはIVisitGroupKeyResolver<String>インターフェースのいずれかを拡張するクラスを作成します。

例えば、ブラウザグループから特定のバージョンのブラウザへドリルダウンできるようにしたいです。これを行うには、GetKeysメソッドを実装してブラウザグループとそれに対応するグループキーを解決する必要があります。このメソッドはブラウザグループの親項目のGUIDを返します:

class BrowserParentKeyResolver : IVisitGroupKeyResolver<string>
 {
 public IEnumerable<string> GetKeys(IVisitGroup visitGroup)
 {
 if (visitGroup == null)
 {
 throw new ArgumentNullException(nameof(visitGroup));
 }

 var browserDataKey = JsonConvert.DeserializeObject<BrowserData>(visitGroup.Id, new JsonSerializerSettings
 {
 TypeNameHandling = TypeNameHandling.All
 });

 return new List<string>
 {
 browserDataKey.BrowserMajorName
 };
 }
 }

### インタラクションフィルターを作成します

このステップは任意です。あなたの次元に対してインタラクションフィルターを実装できます。イベント、目標、キャンペーン、チャネル、連絡先、ダウンロードに基づくインタラクションに関連するデータを無視するためにインタラクションフィルターを使用します。例えば、ウェブサイトのあるページをレポートの一部として表示してほしくない場合は、そのページを無視するように指定するフィルターを作成します。

インタラクションフィルターを作成するには:

-   IInteractionFilterインターフェースを拡張し、KeepInteraction メソッドを実装するクラスを作成します。

以下の例では、定義GUIDに基づく特定のタイプのイベントを持つインタラクションのデータのみを計算するように処理を制限しています。

class EventFilter : IInteractionFilter
{
 public bool KeepInteraction(Interaction interaction)
 {
 if (interaction.Events.Any(data => ReservedIds.Contains(data.DefinitionId)))
 {
 return true;
 }

 return false;
 }

 internal static readonly Guid ReservedIds =
{
// list of guids
};
}
## 報告データベースの更新

新しい次元のデータを格納するために、レポートデータベースを更新する必要があります。結果を保存するテーブルを作成し、そのデータを表現する型を作成し、テーブルに格納されたデータを操作するためのストアドプロシージャを作成します。

### 表を作成する

SQLでテーブルを作成し、その名前は次の慣例に従ってください。Fact\_*YourDimensionName*Metrics *YourDimensionName*はクラス作成時に使った次元名です。

テーブルを作成する際には、Sitecoreで必須かつ必須の複数の列があります:

-   セグメント記録ID
-   セグメントID
-   日付
-   サイトネームID
-   DimensionKeyID
-   FilterId(フィルターID)

モデルクラスで定義された各メトリックプロパティを表すカラムを作成し、名前が一致しなければなりません。これを行うスクリプトの例です:

CREATE TABLE dbo.Fact\_BrowserMetrics(
 -- Mandatory Columns
 SegmentRecordId bigint NOT NULL,
 SegmentId uniqueidentifier NOT NULL,
 Date smalldatetime NOT NULL,
 SiteNameId int NOT NULL,
 DimensionKeyId bigint NOT NULL,
 FilterId uniqueidentifier NULL,
 -- Dimension specific metric columns
 Visits int NOT NULL,
 EngagementValue int NOT NULL,
 Bounces int NOT NULL,
CONSTRAINT PK\_Fact\_BrowserMetrics\_1 PRIMARY KEY CLUSTERED
 (
 SegmentRecordId ASC
 )WITH (PAD\_INDEX = OFF, STATISTICS\_NORECOMPUTE = OFF, IGNORE\_DUP\_KEY = OFF, ALLOW\_ROW\_LOCKS = ON, ALLOW\_PAGE\_LOCKS = ON) ON PRIMARY
 ) ON PRIMARY

### 型とストアドプロシージャを作成します

型とストアドプロシージャを使ってテーブル内のデータを操作します。型はテーブルの構造と正確に一致しなければなりません。例は以下の通りです:

CREATE TYPE dbo.BrowserMetrics\_Type AS TABLE(
 -- Mandatory Columns
 SegmentRecordId bigint NOT NULL,
 SegmentId uniqueidentifier NOT NULL,
 Date smalldatetime NOT NULL,
 SiteNameId int NOT NULL,
 DimensionKeyId bigint NOT NULL,
 FilterId uniqueidentifier NULL,

 -- Dimension specific metric columns
 Visits int NOT NULL,
 EngagementValue int NOT NULL,
 Bounces int NOT NULL,
 PRIMARY KEY CLUSTERED
 (
 SegmentRecordId ASC
 )WITH (IGNORE\_DUP\_KEY = OFF)
 )

ストアドプロシージャは、もし存在しない場合にテーブルにレコードを作成するか、既存のレコードに入ってきた値を追加し、エラーを記録する必要があります。以下がその例です:

CREATE PROCEDURE dbo.Add\_BrowserMetrics\_Tvp
 @table dbo.BrowserMetrics\_Type READONLY
 AS
 BEGIN
 SET NOCOUNT ON;

 BEGIN TRY

 MERGE Fact\_BrowserMetrics AS Target USING @table AS Source
 ON
 Target.SegmentRecordId = Source.SegmentRecordId
 WHEN MATCHED THEN
 UPDATE SET
 Target.Visits = (Target.Visits + Source.Visits),
 Target.EngagementValue = (Target.EngagementValue + Source.EngagementValue),
 Target.Bounces = (Target.Bounces + Source.Bounces)
 WHEN NOT MATCHED THEN
 INSERT (
 SegmentRecordId,
 SegmentId,
 Date,
 SiteNameId,
 DimensionKeyId,
 FilterId,
 Visits,
 EngagementValue,
 Bounces
 )
 VALUES (
 Source.SegmentRecordId,
 Source.SegmentId,
 Source.Date,
 Source.SiteNameId,
 Source.DimensionKeyId,
 Source.FilterId,
 Source.Visits,
 Source.EngagementValue,
 Source.Bounces
 );

 END TRY
 BEGIN CATCH

 DECLARE @error\_number INTEGER = ERROR\_NUMBER();
 DECLARE @error\_severity INTEGER = ERROR\_SEVERITY();
 DECLARE @error\_state INTEGER = ERROR\_STATE();
 DECLARE @error\_message NVARCHAR(4000) = ERROR\_MESSAGE();
 DECLARE @error\_procedure SYSNAME = ERROR\_PROCEDURE();
 DECLARE @error\_line INTEGER = ERROR\_LINE();

 RAISERROR( N'T-SQL ERROR %d, SEVERITY %d, STATE %d, PROCEDURE %s, LINE %d, MESSAGE: %s', @error\_severity, 1, @error\_number, @error\_severity, @error\_state, @error\_procedure, @error\_line, @error\_message ) WITH NOWAIT;
 END CATCH;
 END

## 寸法と指標の項目を作成する

次のステップは、あなたのディメンションとメトリクスを表すSitecoreの定義項目を作成することです。これらの項目は新しいレポートを作成する際に使います。

### 指標項目を作成します

指標項目を作成するには:

1.  **コンテンツエディター**で、*Core*データベースの*FlexibleMetrics*フォルダ(sitecore\`\`/Client/Applications/ExperienceAnalytics/Common/System/ChartFields/FlexibleMetrics)に移動します。
2.  新しい次元に関連付けられた各指標について、 **ホーム** タブの **「挿入** 」グループで選択し、挿入し、名前を付けて *MetricChartField*を付けます。複数の次元でメトリクスが共有できるため、フィールドはすでに存在可能です。前述の例に従い、 EngagementValue カスタムメトリクスの定義項目を作成する必要があります。
3.  新しいアイテムを選択し、以下のフィールドで値を指定します:
    -   **Appearance**セクションの**HeaderText**フィールドで、新しいメトリクスの記述名を入力します。
    -   **DataBinding**セクションの**DataField**フィールドで、作成したテーブルの対応する列の名前(camelCaseで)を入力してください。
4.  セーブ。

### 寸法項目を作成・設定します

次元アイテムを作成・設定するには:

1.  **コンテンツエディター**で、マスターデータベースの**マーケティングコントロールパネル**の*Dimensions*フォルダ(*Marketing Control Panel/Experience Analytics/Dimensions*)に移動し、柔軟な寸法アイテムを格納するサブフォルダを選択します。*Pages*、*Visits*、または自分専用のサブフォルダを作成できます。
2.  **ホーム**タブの**挿入**グループで、*FlexibleDimension*項目を選択し、挿入し、名前を付けます。
3.  新しいアイテムを選択し、以下のフィールドで値を指定します:
    -   **データ**セクションの**メトリクスタイプ**フィールドで、作成したクラス名(例:BrowserMetrics)を入力してください。
    -   **名前**欄に説明的な名前を入力します。
    -   **メトリクス**欄で、次元に追加したいすべてのメトリクスを選択します。
    -   セーブ。

### セグメントアイテムを作成する

Experience Analyticsは、集計時にデータをより小さなセットに絞り込むためにセグメントを使います。データを集約する前に、少なくとも1つのセグメントを指定する必要があります。通常、この目的のために「すべてのインタラクション/訪問」セグメントを指定します。 [カスタムレポートフィルターを作成すれば、セグメント](https://doc.sitecore.com/xp/en/users/100/sitecore-experience-platform/create-a-custom-report-filter-and-segment.html) にはより多くの情報が表示されます。

セグメントを作成するには:

1.  **コンテンツエディター**で*/sitecore/System/Marketing Control Panel/Experience Analytics/Dimensions*に移動し、作成した次元を選択します。
2.  **ホーム**タブの**挿入グループで**、*Segment*アイテムを選択し、挿入し、名前を付けます。
3.  ワークフロー**グループの****レビュー**タブで「**デプロイ」**をクリックします。デフォルトでは、部署から30分後にセグメントのデータ収集が始まります。

> !注展開後にセグメントを変更しないでください。変更するとデータの不整合を引き起こす可能性があります。

## 新しい次元の設定

集約時に呼び出すには、Sitecore構成で新しい次元を指定する必要があります。

新しい次元を設定するには:

1.  このようなパッチファイルを作成してください:
    
    <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
     <sitecore>
     <experienceAnalytics>
     <aggregation>
     <flexibleDimensions>
     <!--Add references to your new dimension here -->
    <dimension id="Guid of your new dimension item" type="Sitecore.ExperienceAnalytics.Aggregation.FlexibleMetrics.Framework.FlexibleDimension\`2Metrics Class fully qualified name, metrics class assembly name, Fully qualified name of Group, Assembly name of Group, Sitecore.ExperienceAnalytics.Aggregation">
    
     <param type="GroupResolver fully qualified name, GroupResolver assembly name" />
    
     <param type="FactCalculator fully qualified name, FactCalculator assembly name"/>
    </dimension>
     </flexibleDimensions>
     </aggregation>
     </experienceAnalytics>
     </sitecore>
    </configuration>
    
2.  オプションとして、親キーリゾルバやフィルターを指定することで、次元に追加のparam要素を追加することもできます:
    
    <dimension …>
    
    ...
    
    <param type="Sitecore.ExperienceAnalytics.Aggregation.FlexibleMetrics.Framework.KeyComposition.HierarchicalKeyComposer\`1System.Guid, Sitecore.ExperienceAnalytics.Aggregation">
     <ParentVisitGroupKeyResolvers hint="list">
     <ParentVisitGroupKeyResolver type="ParentKeyResolver fully qualified name, assembly name" />
     </ParentVisitGroupKeyResolvers>
    </param>
    
    <InteractionFilters hint ="list">
     <InteractionFilter type="Filter fully qualified name, assembly name" />
    </InteractionFilters>
    </dimension>