連絡先の統合

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

メモ

Sitecoreバージョン10.1から、コンタクトのマージ ロジックが変更されました。プロファイルスコアは、最新のSourceInteractionStartDateTimeに基づいてソースからターゲットにマージされます。 「問い合わせ行動プロファイル」を参照してください。

client.MergeContacts()方法を使用して、既存のソース連絡先を既存のターゲット連絡先にマージします。連絡先の統合は、主にWeb Trackerで、進行中のセッションを持つ匿名の連絡先が自分自身を既知の連絡先として識別する場合に使用されます。

コンタクトは、Submit() / SubmitAsync() が呼び出された後にxConnectサービス レイヤーによってマージされます。

次の例は、マージ操作を実行する方法を示しています。

手記

マーケティングオートメーションの登録は統合されません。ただし、マージする前に、すべてのプランからソース連絡先をパージできます。詳細については、「 マーケティングオートメーション運用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 ContactExecutionOptions(new 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 ContactExecutionOptions(new ContactExpandOptions() { }));

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

                    client.Submit();

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

マージロジック

マージ プロセスは、2つの個別の呼び出しに分割されます。最初の呼び出しでは、次の処理が行われます。

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

手記

エクスペリエンス最適化の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 Update 2以降でのマージ後のSearchとデータ抽出の動作

マージ後の廃止された (ソース) 連絡先には、次の内容が適用されます。

  • 古いコンタクトはxDB Collectionデータベースから削除されません。ただし、古い連絡先には、連絡先ファセットや既知の識別子はありません。

  • インタラクションは、マージ中にソースコンタクトから削除されません。マージ後、xDB Collectionデータベースには同じインタラクションのコピーが2つ存在します。1セットのコピーはソース連絡先に属し、1セットのコピーはターゲット連絡先に属します。

データ抽出は次のように動作します。

  • 連絡先データの抽出 では、古い連絡先が返されます。

  • 連絡先データの抽出 では 、展開オプションが使用されている場合、廃止された連絡先のインタラクションが返されます。

  • インタラクションデータの抽出 では、同じインタラクションが2回返されることはありません。

    • インタラクションデータの抽出が開始された後にマージが発生した場合、ソースコンタクトのインタラクションのコピーが返されます。

    • インタラクションデータの抽出が開始される前にマージが発生した場合、ターゲットコンタクトのインタラクションのコピーが返されます。

  • コンタクトデータの抽出が進行中に2つのコンタクトがマージされた場合、マージが発生する前にソースコンタクトが返され、マージが発生した後にターゲットコンタクトが返されるリスクがあります。このシナリオでは、同じファセットデータが2回返されます。データ抽出が行われる前にコンタクトがマージされた場合、ターゲットコンタクトのみがファセットを持ちます。

Searchとインデックス作成は、次のように動作します。

  • 廃止された連絡先は、匿名連絡先のインデックス作成が有効になっている場合にのみインデックス化されます。

  • 古いコンタクトに属するインタラクションはインデックス化 されません 。インタラクションは、ソースコンタクトからターゲットコンタクトにコピーされます。ターゲットコンタクトのインタラクションのコピーはインデックス化されます。

  • Searchでは古い連絡先が返される場合があります - たとえば、最終更新日で検索すると、古い連絡先が返される場合があります。古いコンタクトを除外するには、MergeInfoファセットのObsoleteプロパティがfalseに設定されているコンタクトを検索します。

マージ エラー ログ

9.0 Update 2以降では、リポジトリ呼び出しの1つまたは両方が失敗した場合、マージ操作バッチ全体が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`1[[Sitecore.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`1[[Sitecore.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`1[[Sitecore.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`1[[Sitecore.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`1[[Sitecore.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`1[[Sitecore.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`1[[Sitecore.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.
手記

プライバシー上の理由から、連絡先識別子はログに書き込まれません。

カスタムマージハンドラ

計算ファセットの マージハンドラは 、カスタムマージロジックが必要になる場合があるため、作成する必要があります。値ファセットは自動的にマージされます。ただし、値ファセットにカスタム・マージ・ロジックが必要な場合は、そのファセットのマージ・ハンドラーを作成できます。

ソースとターゲットの連絡先を取得する

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

次の例は、ソース連絡先がマージされた連絡先を取得する方法を示しています。

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 ContactExecutionOptions(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 ContactExecutionOptions(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 ContactExecutionOptions(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 ContactExecutionOptions(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 ContactExecutionOptions(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 ContactExecutionOptions(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 ContactExecutionOptions(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 ContactExecutionOptions(new ContactExpandOptions()));
                    }

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

制限事項と推奨されるプラクティス

連絡先のマージ操作には、次の制限が適用されます。

  • コンタクトがすでにソースとして使用されている場合 (つまり、匿名でMergeInfoファセットがある場合)、別のマージ操作でソースコンタクトとして使用することはできません。例外が発生します。

  • 両方の連絡先をxConnectに保存する 必要があります - つまり、マージを試みる前にclient.SubmitAsync() を呼び出す必要があります。 AddContactMergeを同じバッチに混在させることはできません。

  • マージを実行する同じバッチ内の ソース 連絡先に識別子を追加することはできません。ソース連絡先に識別子を追加する必要がある場合は、そのバッチを送信し、後続のバッチでマージを実行する必要があります。

  • 既知の連絡先 (ソース) を匿名の連絡先 (ターゲット) にマージすることはできません - 既知の連絡先をターゲットにする必要があります。ただし、既知を既知に、匿名を匿名にマージすることはできます。

  • ターゲットの連絡先がすでに他の連絡先にマージされている場合、匿名の連絡先 (ソース) を匿名の連絡先 (ターゲット) にマージすることはできません。この操作を試みると、X-Connectは、匿名連絡先間の循環マージを防ぐために例外を返します。

大事な

連絡先のマージ操作は、バッチごとに1つの操作として実行することを強くお勧めします。このプロセスにより、マージ操作で使用される連絡先を取得または変更する他の操作がなくなります。また、連絡先間の循環マージにつながる可能性のある連絡先のマージAPIの不適切な使用も防止します。

マージされた連絡先の長いチェーンを作成するのに注意してください。これは、既知のものを既知のものに、または匿名を匿名に継続的にマージする場合に発生する可能性があります。

この記事を改善するための提案がある場合は、 お知らせください!