チュートリアル: 連絡先とインタラクションの検索

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

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

このチュートリアルは、xConnectコレクション モデルの拡張チュートリアル シリーズのパート4です。このチュートリアルを完了するには、まずチュートリアル パート12および3を完了する必要があります。

匿名の連絡先はインデックス化されず、検索もできません。エクスペリエンス データはインデックス化されますが、xDBインデックスに格納されるのはIDと同期トークンのみです。 ExpandOptionsを使用してクエリの一部としてファセットを返す場合、そのデータはxDBインデックスからではなく、xDB Collectionデータベース から取得されます。

xConnectは、個人を特定できる情報 (PII) コンプライアンスを強制するメカニズムを提供しますが、それを使用するかどうかはお客様が決定する必要があります。ファセットまたはプロパティがPIISensitiveとマークされている場合、インデックスは作成されず、検索できません。連絡先を名で検索できない場合でも、連絡先の名などのPII機密データを返すことができます。

このチュートリアルでは、次の方法について説明します。

  • Search連絡先

  • Searchインタラクション

Search連絡先

連絡先を検索するには:

  1. Visual StudioのSolution Explorerで、Program.csファイルをダブルクリックし、内容を次のコードで置き換えます。

    using Sitecore.XConnect;
    using Sitecore.XConnect.Client;
    using Sitecore.XConnect.Client.WebApi;
    using Sitecore.XConnect.Collection.Model;
    using Sitecore.XConnect.Schema;
    using Sitecore.Xdb.Common.Web;
    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    
    namespace Sitecore.Documentation
    {
        public class Program
        {
            // From <xConnect instance>\App_Config\AppSettings.config
            const string CERTIFICATE_OPTIONS = 
                "StoreName=My;StoreLocation=LocalMachine;FindType=FindByThumbprint;FindValue=???";
    
            // From your installation
            const string XCONNECT_URL = "https://???XConnect.local";
    
            private static void Main(string[] args)
            {
                MainAsync(args).ConfigureAwait(false).GetAwaiter().GetResult();
                System.Console.ForegroundColor = ConsoleColor.DarkGreen;
                System.Console.WriteLine("");
                Console.WriteLine("END OF PROGRAM.");
                Console.ReadKey();
            }
    
            private static async Task MainAsync(string[] args)
            {
                CertificateHttpClientHandlerModifierOptions options = CertificateHttpClientHandlerModifierOptions.Parse(CERTIFICATE_OPTIONS);
    
                var certificateModifier = new CertificateHttpClientHandlerModifier(options);
    
                List<IHttpClientModifier> clientModifiers = new List<IHttpClientModifier>();
                var timeoutClientModifier = new TimeoutHttpClientModifier(new TimeSpan(0, 0, 20));
                clientModifiers.Add(timeoutClientModifier);
    
                var collectionClient = new CollectionWebApiClient(
                    new Uri(XCONNECT_URL + "/odata"),
                    clientModifiers,
                    new[] { certificateModifier }
                );
    
                var searchClient = new SearchWebApiClient(
                    new Uri(XCONNECT_URL + "/odata"),
                    clientModifiers,
                    new[] { certificateModifier }
                );
    
                var configurationClient = new ConfigurationWebApiClient(
                    new Uri(XCONNECT_URL + "/configuration"),
                    clientModifiers,
                    new[] { certificateModifier }
                );
    
                var cfg = new XConnectClientConfiguration(
                    new XdbRuntimeModel(CollectionModel.Model),
                    collectionClient,
                    searchClient,
                    configurationClient
                );
    
                try
                {
                    cfg.Initialize();
    
                    // Print xConnect if configuration is valid
                    var arr = new[]
                    {
                        @"            ______                                                       __     ",
                        @"           /      \                                                     |  \    ",
                        @" __    __ |  $$$$$$\  ______   _______   _______    ______    _______  _| $$_   ",
                        @"|  \  /  \| $$   \$$ /      \ |       \ |       \  /      \  /       \|   $$ \  ",
                        @"\$$\/  $$| $$      |  $$$$$$\| $$$$$$$\| $$$$$$$\|  $$$$$$\|  $$$$$$$ \$$$$$$   ",
                        @" >$$  $$ | $$   __ | $$  | $$| $$  | $$| $$  | $$| $$    $$| $$        | $$ __  ",
                        @" /  $$$$\ | $$__/  \| $$__/ $$| $$  | $$| $$  | $$| $$$$$$$$| $$_____   | $$|  \",
                        @"|  $$ \$$\ \$$    $$ \$$    $$| $$  | $$| $$  | $$ \$$     \ \$$     \   \$$  $$",
                        @" \$$   \$$  \$$$$$$   \$$$$$$  \$$   \$$ \$$   \$$  \$$$$$$$  \$$$$$$$    \$$$$ "
                    };
                    Console.WindowWidth = 160;
                    foreach (string line in arr)
                        Console.WriteLine(line);
    
                }
                catch (XdbModelConflictException ce)
                {
                    Console.WriteLine("ERROR:" + ce.Message);
                    return;
                }
    
                // Initialize a client using the validated configuration
                using (var client = new XConnectClient(cfg))
                {
                    try
                    {
                        var results0 = client.Contacts.ToEnumerable().Count();
    
                        Console.WriteLine("Total contacts: " + results0.ToString());
    
                        // Use InteractionsCache instead of
                        // client.Contacts.Where(x => x.Interactions.Any())
                        // as not all search providers support joins
                        var results = await client.Contacts.Where(c => c.InteractionsCache().InteractionCaches.Any()).GetBatchEnumerator();
    
                        Console.WriteLine("Contacts with interactions: " + results.TotalCount);
    
                        var results2 = await client.Contacts.Where(c => c.LastModified > DateTime.UtcNow.AddHours(-10)).GetBatchEnumerator();
    
                        Console.WriteLine("Updated 10hrs ago: " + results2.TotalCount);
    
                        var results3 = await client.Contacts.Where(c => c.GetFacet<PersonalInformation>().JobTitle == "Programmer Writer").GetBatchEnumerator();
    
                        Console.WriteLine("Programmer Writers: " + results3.TotalCount);
    
                        var results4 = await client.Interactions.Where(i => i.EndDateTime > DateTime.UtcNow.AddHours(-10)).GetBatchEnumerator();
    
                        Console.WriteLine("Interactions < 10hrs old: " + results4.TotalCount);
    
                        Console.ReadKey();
                    }
                    catch (XdbExecutionException ex)
                    {
                        // Deal with exception
                    }
                }
            }
        }
    }
  2. CERTIFICATE_OPTIONS定数とXCONNECT_URL定数を編集します。

  3. Program.csファイルを保存します。

  4. F5キーを押してアプリを実行します。接続が確立されると、アプリはターミナルに次のように書き込みます。

    • 連絡先の数。

    • インタラクションのある連絡先の数。

    • 10時間以上前に更新された連絡先の数。

    • 役職がProgrammer Writerの連絡先の数。

    A terminal with the contact details in the app output.
    手記

    数値は、前のチュートリアルでプログラムをいつ、何回実行したかによって異なります。

Searchインタラクション

インタラクションを検索するには:

  1. Visual StudioのSolution Explorerで、Program.csファイルをダブルクリックし、内容を次のコードで置き換えます。

    using Sitecore.XConnect;
    using Sitecore.XConnect.Client;
    using Sitecore.XConnect.Client.WebApi;
    using Sitecore.XConnect.Collection.Model;
    using Sitecore.XConnect.Schema;
    using Sitecore.Xdb.Common.Web;
    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    
    namespace Sitecore.Documentation
    {
        public class Program
        {
            // From <xConnect instance>\App_Config\AppSettings.config
            const string CERTIFICATE_OPTIONS = 
                "StoreName=My;StoreLocation=LocalMachine;FindType=FindByThumbprint;FindValue=???";
    
            // From your installation
            const string XCONNECT_URL = "https://???XConnect.local";
    
            private static void Main(string[] args)
            {
                MainAsync(args).ConfigureAwait(false).GetAwaiter().GetResult();
                System.Console.ForegroundColor = ConsoleColor.DarkGreen;
                System.Console.WriteLine("");
                Console.WriteLine("END OF PROGRAM.");
                Console.ReadKey();
            }
    
            private static async Task MainAsync(string[] args)
            {
                CertificateHttpClientHandlerModifierOptions options = CertificateHttpClientHandlerModifierOptions.Parse(CERTIFICATE_OPTIONS);
    
                var certificateModifier = new CertificateHttpClientHandlerModifier(options);
    
                List<IHttpClientModifier> clientModifiers = new List<IHttpClientModifier>();
                var timeoutClientModifier = new TimeoutHttpClientModifier(new TimeSpan(0, 0, 20));
                clientModifiers.Add(timeoutClientModifier);
    
                var collectionClient = new CollectionWebApiClient(
                    new Uri(XCONNECT_URL + "/odata"),
                    clientModifiers,
                    new[] { certificateModifier }
                );
    
                var searchClient = new SearchWebApiClient(
                    new Uri(XCONNECT_URL + "/odata"),
                    clientModifiers,
                    new[] { certificateModifier }
                );
    
                var configurationClient = new ConfigurationWebApiClient(
                    new Uri(XCONNECT_URL + "/configuration"),
                    clientModifiers,
                    new[] { certificateModifier }
                );
    
                var cfg = new XConnectClientConfiguration(
                    new XdbRuntimeModel(CollectionModel.Model),
                    collectionClient,
                    searchClient,
                    configurationClient
                );
    
                try
                {
                    cfg.Initialize();
    
                    // Print xConnect if configuration is valid
                    var arr = new[]
                    {
                        @"            ______                                                       __     ",
                        @"           /      \                                                     |  \    ",
                        @" __    __ |  $$$$$$\  ______   _______   _______    ______    _______  _| $$_   ",
                        @"|  \  /  \| $$   \$$ /      \ |       \ |       \  /      \  /       \|   $$ \  ",
                        @"\$$\/  $$| $$      |  $$$$$$\| $$$$$$$\| $$$$$$$\|  $$$$$$\|  $$$$$$$ \$$$$$$   ",
                        @" >$$  $$ | $$   __ | $$  | $$| $$  | $$| $$  | $$| $$    $$| $$        | $$ __  ",
                        @" /  $$$$\ | $$__/  \| $$__/ $$| $$  | $$| $$  | $$| $$$$$$$$| $$_____   | $$|  \",
                        @"|  $$ \$$\ \$$    $$ \$$    $$| $$  | $$| $$  | $$ \$$     \ \$$     \   \$$  $$",
                        @" \$$   \$$  \$$$$$$   \$$$$$$  \$$   \$$ \$$   \$$  \$$$$$$$  \$$$$$$$    \$$$$ "
                    };
                    Console.WindowWidth = 160;
                    foreach (string line in arr)
                        Console.WriteLine(line);
    
                }
                catch (XdbModelConflictException ce)
                {
                    Console.WriteLine("ERROR:" + ce.Message);
                    return;
                }
    
                // Initialize a client using the validated configuration
                using (var client = new XConnectClient(cfg))
                {
                    try
                    {
                        var results0 = client.Contacts.ToEnumerable().Count();
    
                        Console.WriteLine("Total contacts: " + results0.ToString());
    
                        var results = await client.Contacts.Where(c => c.InteractionsCache().InteractionCaches.Any()).WithExpandOptions(new ContactExpandOptions(PersonalInformation.DefaultFacetKey)
                        {
                            Interactions = new RelatedInteractionsExpandOptions(IpInfo.DefaultFacetKey)
                            {
                                EndDateTime = DateTime.MaxValue,
                                StartDateTime = DateTime.MinValue
                            }
                        })
                        .GetBatchEnumerator();
    
                        Console.WriteLine("Contacts with interactions: " + results.TotalCount);
    
                        var results2 = await client.Contacts.Where(c => c.LastModified > DateTime.UtcNow.AddHours(-10)).GetBatchEnumerator();
    
                        Console.WriteLine("Updated 10hrs ago: " + results2.TotalCount);
    
                        var results3 = await client.Contacts.Where(c => c.GetFacet<PersonalInformation>().JobTitle == "Programmer Writer").GetBatchEnumerator();
    
                        Console.WriteLine("Programmer Writers: " + results3.TotalCount);
    
                        var results4 = await client.Interactions.Where(i => i.EndDateTime > DateTime.UtcNow.AddHours(-10))
                            .WithExpandOptions(new InteractionExpandOptions(new string[] { IpInfo.DefaultFacetKey })
                            {
                                Contact = new RelatedContactExpandOptions(PersonalInformation.DefaultFacetKey)
                            }
                         ).GetBatchEnumerator();
    
                        Console.WriteLine("Interactions < 10hrs old: " + results4.TotalCount);
    
                        int interactionNumber = 0;
    
                        // Enumerate through batches of 200
                        while (await results4.MoveNext())
                        {
                            // Loop through interactions in current batch
                            foreach (var interaction in results4.Current)
                            {
                                interactionNumber++;
    
                                Console.WriteLine("Interaction #" + interactionNumber);
    
                                var ipInfoFacet = interaction.GetFacet<IpInfo>(IpInfo.DefaultFacetKey);
    
                                if (ipInfoFacet != null)
                                {
                                    Console.WriteLine("Interaction business name: " + ipInfoFacet.BusinessName);
                                }
                                else
                                {
                                    Console.WriteLine("No business name available.");
                                }
    
                                var contact = interaction.Contact;
    
                                if (contact != null)
                                {
                                    var realContact = contact as Contact;
    
                                    var personal = realContact.GetFacet<PersonalInformation>(PersonalInformation.DefaultFacetKey);
    
                                    if (personal != null)
                                    {
                                        Console.WriteLine("Interaction contact name: " + personal.FirstName);
                                    }
                                    else
                                    {
                                        Console.WriteLine("No contact name available.");
                                    }
                                }
    
                                Console.WriteLine();
                            }
                        }
                        Console.ReadKey();
                    }
                    catch (XdbExecutionException ex)
                    {
                        // Deal with exception
                    }
                }
            }
        }
    }
  2. CERTIFICATE_OPTIONS定数とXCONNECT_URL定数を編集します。

  3. Program.csファイルを保存します。

  4. F5キーを押してアプリを実行します。接続が確立されると、アプリはターミナルに次のように書き込みます。

    • 連絡先の数。

    • インタラクションのある連絡先の数。

    • 10時間以上前に更新された連絡先の数。

    • 役職がProgrammer Writerの連絡先の数。

    • 各インタラクションについて:

      • IpInfoファセットが存在する場合のインタラクションのビジネス名。

      • PersonalInfoファセットが存在する場合、インタラクションのコンタクトの名前。

    A terminal with the contact and interaction details in the app output.

次のチュートリアルに進み、カスタム ファセットとイベントの作成方法を学習します。

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