---
title: "マージコンタクト"
slug: "merge-contacts"
abstract: "既存のソース連絡先を既存のターゲット連絡先に統合する方法。"
---
# マージコンタクト

既存の送信元連絡先を既存のターゲット連絡先にマージするには、client.MergeContacts() メソッドを使用します。 [コンタクトマージは、ウェブトラッカーで主に](https://doc.sitecore.com/xp/ja/developers/91/sitecore-experience-platform/contact-merge.html "Contact merge") 、進行中のセッション中の匿名の接触者が既知の連絡先として自分を特定した場合に使われます。

連絡先はSubmit() / SubmitAsync() 呼び出し後、xConnectサービス層によって統合されます。

以下の例はマージ操作の実行方法を示しています:

> !注マーケティングオートメーションの登録は統合されません。ただし、マージ前にすべてのプランから送信元連絡先を消去することは可能です。詳細については、[マーケティングオートメーション運用API](https://doc.sitecore.com/xp/ja/developers/91/sitecore-experience-platform/marketing-automation-operations-api.html "Marketing Automation Operations API")をご覧ください。

using System;
using System.Threading.Tasks;
using Sitecore.XConnect;
using Sitecore.XConnect.Client;

namespace Documentation
{
 public class MergeContacts
 {
 // Async example
 public async void ExampleAsync()
 {
 using (Sitecore.XConnect.Client.XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
 {
 try
 {
 // New known contact
 var identifers = new ContactIdentifier { new ContactIdentifier("twitter", "myrtlesitecore", ContactIdentifierType.Known) };

 var newContact = new Contact(identifers);

 client.AddContact(newContact);

 // Contact must be saved before a merge
 await client.SubmitAsync();

 // Reference to existing contact
 var reference = new Sitecore.XConnect.ContactReference(Guid.Parse("B9814105-1F45-E611-82E6-34E6D7117DCB"));

 Task<Sitecore.XConnect.Contact> contactTask = client.GetAsync<Sitecore.XConnect.Contact>(reference, new Sitecore.XConnect.ContactExpandOptions() { });

 var existingContact = await contactTask;

 // Data copied FROM existingContact TO newContact
 client.MergeContacts(existingContact, newContact);

 await client.SubmitAsync();

 }
 catch (XdbExecutionException ex)
 {
 // Manage exceptions
 }
 }
 }

 // Sync example
 public void ExampleSync()
 {
 using (Sitecore.XConnect.Client.XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
 {
 try
 {
 // New known contact
 var identifers = new ContactIdentifier { new ContactIdentifier("twitter", "myrtlesitecore", ContactIdentifierType.Known) };

 var newContact = new Contact(identifers);

 client.AddContact(newContact);

 // Contact must be saved before a merge
 client.Submit();

 // Reference to existing contact
 var reference = new Sitecore.XConnect.ContactReference(Guid.Parse("B9814105-1F45-E611-82E6-34E6D7117DCB"));

 Contact existingContact = client.Get<Sitecore.XConnect.Contact>(reference, new Sitecore.XConnect.ContactExpandOptions() { });

 // Data copied FROM existingContact TO newContact
 client.MergeContacts(existingContact, newContact);

 client.Submit();

 }
 catch (XdbExecutionException ex)
 {
 // Manage exceptions
 }
 }
 }
 }
}

## マージロジック

マージプロセスは2つの別々の通話に分かれています。最初の通話では以下のことが起こります。

-   すべての値面は、ファセットがすでにターゲットコンタクト上に存在する場合を除き、ソースコンタクトからターゲットコンタクトへコピーされます。例えば、ターゲットコンタクトにすでに PersonalInformation ファセットがある場合、それはソースコンタクトの PersonalInformation ファセットによって上書きされません。

> !注Experience OptimizationのTestCombinationsファセットは異なる挙動をします。匿名の接触者がテストの組み合わせに触れ、セッションの途中で自己を特定した場合、既知の接触者のテストの組み合わせの側面は上書きされます。

-   計算されたファセットマージハンドラが実行されます。
-   匿名連絡先の登録は放棄されます。つまり:
    -   AutomationPlanEnrollmentCache面は統合されていません
    -   AutomationPlanExit面は統合されていません
-   すべてのファセット値はソースの接点から削除されます。
-   既知の識別子はすべて送信元連絡先からターゲット接触者へ移動され、匿名識別子は移動されません。既知の識別子がなければ、送信元連絡先は匿名になります。
-   相互作用の側面を含むすべての相互作用は、ソース接触からターゲット接触へコピーされます。相互作用はソース接触から削除 **されません** 。
-   ソース接触には以下のプロパティ値を持つ MergeInfo 面が追加されます:
    -   MergeDate - 合併運転の日時
    -   Obsolete - これから true
    -   SuccessorContactId - ターゲット接触者のID
-   匿名の識別子がターゲットコンタクトに追加されます。識別子は送信元コンタクトの ID であり、送信元は次のように定義されます。 Sitecore.XConnect.Constants.MergeIdentifierSource
-   操作が正常に完了すると、ターゲットおよびソースの接触点のファスレットや識別子がメモリ上で更新されます。

この時点で、すべての変更が保存され、リポジトリからコピーされた新しいインタラクションにIDが割り当てられます。2回目の呼び出しでは以下のことが起こります。

-   InteractionMergeInfo面は、ソース連絡先に属するすべてのやり取りに追加され、以下の重要な情報が含まれます。
    
    -   SuccessorInteractionId - この相互作用を置き換える相互作用のID。
    -   SuccessorContactId - 後継者の相互作用を所有するコンタクトのID。
    
    > !注InteractionMergeInfo面はSitecore.XConnect.Collection.ContactMerge.Modelという別のマージモデルの一部です。このモデルはコアモデルの一部ではなく、Content DeliveryやContent Managementのようなクライアントにはデフォルトで存在しません。
    

### 9.0アップデート2以降のマージ後のSearchおよびデータ抽出の動作

マージ後に廃止された(ソース)交接点には以下が適用されます:

-   旧式の接点はxDBコレクションのデータベースから削除されません。しかし、旧式の接点には接触面や既知の識別子はありません。
-   マージ中にインタラクションはソースコンタクトから削除されません。マージ後、xDBコレクションデータベースには同じインタラクションのコピーが2つ存在します。1セットのコピーはソースコンタクトに属し、もう1セットはターゲットコンタクトに属します。

データ抽出は以下の動作をします。

-   連絡先データ抽出 **は、** 廃止された接触点を返します。
-   展開オプションを使うと、連絡先データ **抽出は廃** 止された接触のやり取りを返します。
-   相互作用データ抽出では、同じ相互作用が二度返される **ことはありません** 。
    -   インタラクションデータ抽出開始後にマージが起こると、元の連絡先のインタラクションコピーが返されます。
    -   もしマージがインタラクションデータ抽出開始前に行われた場合、ターゲットコンタクトのインタラクションコピーが返されます。
-   接触データ抽出中に2つの接点がマージされると、マージが起こる前に元の接触が返され、マージ後にターゲットの接触が戻されるリスクがあります。この場合、同じファセットデータが2回返されます。データ抽出前にコンタクトがマージされた場合、ファセットを持つのはターゲットコンタクトのみとなります。

Searchおよびインデックス作成は以下の通りに動作します:

-   廃止された連絡先は、匿名連絡先のインデックス化が有効である場合にのみインデックス化されます。
-   廃止された接触に属する **相互作用はインデックス** されません。相互作用はソース接触からターゲット接触へコピーされます。ターゲット接触の相互作用コピーもインデックス化されます。
-   Searchは旧式の連絡先を返すことができます。例えば、最終修正日で検索すると一部の旧式連絡先が返されることがあります。古い連絡先を除外するには、MergeInfo面のObsoleteプロパティがfalseに設定されている連絡先を検索してください。

### マージエラーログ

9.0アップデート2以降では、リポジトリの呼び出しのいずれかまたは両方が失敗した場合、マージ操作全体のバッチがxConnectログに書き込まれます。ログメッセージには、操作、型、ステータス、連絡先やインタラクションIDなどのデータが含まれます。

Error Batch operations:
 Operation type: Sitecore.XConnect.Operations.MergeContactsOperation, Sitecore.XConnect, Version=0.0.1.0, Culture=neutral, PublicKeyToken=null. Batch index: 0. Status: Failed.
 Operation type: Sitecore.XConnect.Service.MergeContactsInvoker+ContactMergeHandlerOperation, Sitecore.XConnect.Service, Version=0.0.1.0, Culture=neutral, PublicKeyToken=null. Batch index: 1. Status: Succeeded.
 Operation type: Sitecore.XConnect.Operations.GetEntityOperation\`1Sitecore.XConnect.Contact, Sitecore.XConnect, Version=0.0.1.0, Culture=neutral, PublicKeyToken=null, Sitecore.XConnect, Version=0.0.1.0, Culture=neutral, PublicKeyToken=null. Batch index: 2. Status: Succeeded.
 Operation type: Sitecore.XConnect.Operations.GetEntityOperation\`1Sitecore.XConnect.Contact, Sitecore.XConnect, Version=0.0.1.0, Culture=neutral, PublicKeyToken=null, Sitecore.XConnect, Version=0.0.1.0, Culture=neutral, PublicKeyToken=null. Batch index: 3. Status: Succeeded.
 Operation type: Sitecore.XConnect.Operations.SetFacetOperation\`1Sitecore.XConnect.Collection.Model.MergeInfo, Sitecore.XConnect.Collection.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, Sitecore.XConnect, Version=0.0.1.0, Culture=neutral, PublicKeyToken=null. Batch index: 4. Status: Succeeded. Facet key: MergeInfo, facet target: Contact. ID - {288fa990-1a61-0000-0000-05383f9d652b}.
 Operation type: Sitecore.XConnect.Operations.AddContactIdentifierOperation, Sitecore.XConnect, Version=0.0.1.0, Culture=neutral, PublicKeyToken=null. Batch index: 5. Status: Succeeded.
 Operation type: Sitecore.XConnect.Operations.ClearFacetOperation, Sitecore.XConnect, Version=0.0.1.0, Culture=neutral, PublicKeyToken=null. Batch index: 6. Status: Succeeded. Facet key: KeyBehaviorCache, facet target: Contact. ID - {288fa990-1a61-0000-0000-05383f9d652b}.
 Operation type: Sitecore.XConnect.Operations.ClearFacetOperation, Sitecore.XConnect, Version=0.0.1.0, Culture=neutral, PublicKeyToken=null. Batch index: 7. Status: Succeeded. Facet key: EngagementMeasures, facet target: Contact. ID - {288fa990-1a61-0000-0000-05383f9d652b}.
 Operation type: Sitecore.XConnect.Operations.ClearFacetOperation, Sitecore.XConnect, Version=0.0.1.0, Culture=neutral, PublicKeyToken=null. Batch index: 8. Status: Succeeded. Facet key: InteractionsCache, facet target: Contact. ID - {288fa990-1a61-0000-0000-05383f9d652b}.
 Operation type: Sitecore.XConnect.Service.Operations.CopyInteractionOperation, Sitecore.XConnect.Service, Version=0.0.1.0, Culture=neutral, PublicKeyToken=null. Batch index: 9. Status: Succeeded. Entity type: Interaction. Entity ID: {288fa990-1a61-0000-0000-05383f9f1feb}.
 Operation type: Sitecore.XConnect.Service.Operations.SetInteractionMergeInfoOperation, Sitecore.XConnect.Service, Version=0.0.1.0, Culture=neutral, PublicKeyToken=null. Batch index: 10. Status: Failed. Facet key: InteractionMergeInfo, facet target: Interaction. ID - {288fa990-1a61-0000-0000-05383f9db83e}.
 Operation type: Sitecore.XConnect.Service.Operations.CopyFacetOperation\`1Sitecore.XConnect.Facet, Sitecore.XConnect, Version=0.0.1.0, Culture=neutral, PublicKeyToken=null, Sitecore.XConnect.Service, Version=0.0.1.0, Culture=neutral, PublicKeyToken=null. Batch index: 11. Status: Succeeded. Facet key: CustomValues, facet target: Interaction. ID - {288fa990-1a61-0000-0000-05383f9f1feb}.
 Operation type: Sitecore.XConnect.Operations.SetFacetOperation\`1Sitecore.XConnect.Collection.Model.EngagementMeasures, Sitecore.XConnect.Collection.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, Sitecore.XConnect, Version=0.0.1.0, Culture=neutral, PublicKeyToken=null. Batch index: 12. Status: Succeeded. Facet key: EngagementMeasures, facet target: Contact. ID - {288fa990-1a61-0000-0000-05383f9d6535}.
 Operation type: Sitecore.XConnect.Operations.SetFacetOperation\`1Sitecore.XConnect.Collection.Model.Cache.InteractionsCache, Sitecore.XConnect.Collection.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, Sitecore.XConnect, Version=0.0.1.0, Culture=neutral, PublicKeyToken=null. Batch index: 13. Status: Succeeded. Facet key: InteractionsCache, facet target: Contact. ID - {288fa990-1a61-0000-0000-05383f9d6535}.
 Operation type: Sitecore.XConnect.Operations.SetFacetOperation\`1Sitecore.XConnect.Collection.Model.KeyBehaviorCache, Sitecore.XConnect.Collection.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, Sitecore.XConnect, Version=0.0.1.0, Culture=neutral, PublicKeyToken=null. Batch index: 14. Status: Succeeded. Facet key: KeyBehaviorCache, facet target: Contact. ID - {288fa990-1a61-0000-0000-05383f9d6535}.
 Operation type: Sitecore.XConnect.Service.IdentifierOperationWithContactEntity, Sitecore.XConnect.Service, Version=0.0.1.0, Culture=neutral, PublicKeyToken=null. Batch index: 15. Status: Succeeded.

> !注プライバシーの理由から、連絡先識別子はログに記録されません。

## カスタムマージハンドラ

計算されたファセットには計算されたファセットマー [ジハンドラを作成する](https://doc.sitecore.com/xp/ja/developers/91/sitecore-experience-platform/create-a-facet-merge-handler.html "Create a facet merge handler") 必要があります。カスタムマージロジックが必要な場合もあります。バリューファセットは自動的にマージされます。ただし、そのファセットがカスタムマージロジックを必要とする場合は、そのファセットのマージハンドラを作成できます。

## 情報源とターゲットの連絡先を入手してください

ソースコンタクトとターゲットコンタクトは、ターゲットコンタクトの識別子とソースコンタクトのファセットでリンクされます。マージ中にソースコンタクトは削除されません。

以下の例は、ソースコンタクトが統合されたコンタクトを取得する方法を示しています。

using Sitecore.XConnect.Collection.Model;
using System;
using System.Threading.Tasks;
using Sitecore.XConnect;
using Sitecore.XConnect.Client;

namespace Documentation
{
 public class GetTargetContacts
 {
 // Async example
 public async void ExampleAsync()
 {
 using (Sitecore.XConnect.Client.XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
 {
 try
 {
 var sourceContactId = Guid.Parse("77f75056-5d96-4155-93e5-d206214d6a40");

 // Get source contact - this is an obsolete contact that has been used
 // in a merge operation
 Task<Contact> contactTask = client.GetAsync<Contact>(new ContactReference(sourceContactId), new ContactExpandOptions());

 Contact contact = await contactTask;

 // Get the merge facet - you do not need to request this facet as part of the expand options
 var mergeFacet = contact.GetFacet<MergeInfo>(MergeInfo.DefaultFacetKey);

 if (mergeFacet != null)
 {
 // If the merge facet exists, use the SuccessorContactId to retrieve the target contact that
 // the source contact was merged into
 var targetContactTask = client.GetAsync<Contact>(new ContactReference(mergeFacet.SuccessorContactId), new ContactExpandOptions());

 var targetContact = await targetContactTask;
 }
 }
 catch (XdbExecutionException ex)
 {
 // Manage exceptions
 }
 }
 }

 // Sync example
 public void ExampleSync()
 {
 using (Sitecore.XConnect.Client.XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
 {
 try
 {
 var sourceContactId = Guid.Parse("77f75056-5d96-4155-93e5-d206214d6a40");

 // Get source contact - this is an obsolete contact that has been used
 // in a merge operation
 Contact contact = client.Get<Contact>(new ContactReference(sourceContactId), new ContactExpandOptions());

 // Get the merge facet - you do not need to request this facet as part of the expand options
 var mergeFacet = contact.GetFacet<MergeInfo>(MergeInfo.DefaultFacetKey);

 if (mergeFacet != null)
 {
 // If the merge facet exists, use the SuccessorContactId to retrieve the target contact that
 // the source contact was merged into
 var targetContact = client.GetAsync<Contact>(new ContactReference(mergeFacet.SuccessorContactId), new ContactExpandOptions());
 }
 }
 catch (XdbExecutionException ex)
 {
 // Manage exceptions
 }
 }
 }
 }
}

以下の例は、特定の接点のマージ操作で以前にソース接点として使用された接点の取得方法を示しています。

using Sitecore.XConnect.Collection.Model;
using Sitecore.XConnect.Operations;
using System;
using System.Threading.Tasks;
using Sitecore.XConnect;
using Sitecore.XConnect.Client;
using System.Linq;
using System.Collections.Generic;

namespace Documentation
{
 public class GetMergedContacts
 {
 // Async example
 public async void ExampleAsync()
 {
 using (Sitecore.XConnect.Client.XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
 {
 try
 {
 // Get contact
 Task<Contact> contactTask = client.GetAsync<Contact>(new IdentifiedContactReference("twitter", "myrtlesitecore"), new ContactExpandOptions());

 Contact contact = await contactTask;

 // Get all identifiers pointing to source contacts that were merged into this contact
 var mergeIdentifiers = contact.Identifiers.Where(x => x.Source == Sitecore.XConnect.Constants.MergeIdentifierSource);

 if (mergeIdentifiers.Any())
 {
 // Build a list of ContactReference objects from the merge identifiers - the identifier
 // string is the ID of a source contact
 var mergedContactReferences = new List<ContactReference>();

 foreach (var mergeIdentifier in mergeIdentifiers)
 {
 Guid id = Guid.Empty;

 if (Guid.TryParse(mergeIdentifier.Identifier, out id))
 {
 ContactReference reference = new ContactReference(id);

 mergedContactReferences.Add(reference);
 }
 }

 // Get all contacts that were previously merged into this contact
 var contactsTask = client.GetAsync<Contact>(mergedContactReferences.ToArray(), new ContactExpandOptions());

 var contacts = await contactsTask;
 }

 }
 catch (XdbExecutionException ex)
 {
 // Manage exceptions
 }
 }
 }

 // Sync example
 public void ExampleSync()
 {
 using (Sitecore.XConnect.Client.XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
 {

 try
 {
 // Get contact
 Contact contact = client.Get<Contact>(new IdentifiedContactReference("twitter", "myrtlesitecore"), new ContactExpandOptions());

 // Get all identifiers pointing to source contacts that were merged into this contact
 var mergeIdentifiers = contact.Identifiers.Where(x => x.Source == Sitecore.XConnect.Constants.MergeIdentifierSource);

 if (mergeIdentifiers.Any())
 {
 // Build a list of ContactReference objects from the merge identifiers - the identifier
 // string is the ID of a source contact
 var mergedContactReferences = new List<ContactReference>();

 foreach (var mergeIdentifier in mergeIdentifiers)
 {
 Guid id = Guid.Empty;

 if (Guid.TryParse(mergeIdentifier.Identifier, out id))
 {
 ContactReference reference = new ContactReference(id);

 mergedContactReferences.Add(reference);
 }
 }

 // Get all contacts that were previously merged into this contact
 var contacts = client.Get<Contact>(mergedContactReferences.ToArray(), new ContactExpandOptions());
 }

 }
 catch (XdbExecutionException ex)
 {
 // Manage exceptions
 }
 }
 }
 }
}

## 制限事項と推奨される慣行

接触マージ操作には以下の制限が適用されます:

-   もし連絡先がすでにソースとして使われている場合、つまり匿名で MergeInfo 的な側面がある場合、別のマージ操作でソース連絡先として使うことはできません。例外が付与されます。
-   両方の連絡先をxConnectに保存しておく必要があります。つまり、マージを試みる前に client.SubmitAsync() に連絡しなければならないということです。 AddContact と Merge を同じバッチで混ぜることはできません。
-   マージを行う同じバッチ内でソースコンタクトに識別子を追加することはできません。もしソースコンタクトに識別子を追加する必要がある場合は、そのバッチを提出し、次のバッチでマージを行う必要があります。
-   既知の接触者(情報源)を匿名の接触者(ターゲット)に統合することはできません。既知の接触者がターゲットでなければなりません。ただし、既知の連絡先を既知のものに、匿名のものを匿名に統合することは可能です。

> !重要コンタクトマージ操作はバッチごとに1回の操作として実行することを強く推奨します。このプロセスにより、マージ操作で使われた接触を取得または変更する他の操作がなくなります。

長い連結された連絡先を作ることに注意してください。これは、既知から既知に、匿名から匿名に繰り返し合併すると起こり得ます:

![bad-merge1.png](https://doc.sitecore.com/api/markdown-image/xp/ja/developers/91/sitecore-experience-platform/images/bad-merge1.png)