---
title: "ウォークスルー:連絡先と交流の検索"
slug: "walkthrough--searching-contacts-and-interactions"
abstract: "Sitecore xConnectで連絡先ややり取りを検索する方法。"
---
# ウォークスルー:連絡先と交流の検索

このウォークスルーは「 [エクステンディング・ザ・xConnectコレクション」モデルウォークスルーシリーズ](https://doc.sitecore.com/xp/ja/developers/93/sitecore-experience-platform/extending-the-xconnect-collection-model-walkthrough-series.html "Extending the xConnect collection model walkthrough series")の第4部です。このウォークスルーを完了するには、まずパート[1](https://doc.sitecore.com/xp/ja/developers/93/sitecore-experience-platform/walkthrough--creating-a-contact-and-an-interaction.html "Walkthrough: Creating a contact and an interaction")、[2](https://doc.sitecore.com/xp/ja/developers/93/sitecore-experience-platform/walkthrough--setting-contact-and-interaction-facets.html "Walkthrough: Setting contact and interaction facets")、[3](https://doc.sitecore.com/xp/ja/developers/93/sitecore-experience-platform/walkthrough--getting-contacts.html "Walkthrough: Getting contacts")のウォークスルーをクリアする必要があります。

匿名の連絡先はインデックス化されず、検索もできません。経験データはインデックス化されますが、[xDBインデックス](https://doc.sitecore.com/xp/en/developers/100/platform-administration-and-architecture/xdb-index.html)にはIDと同期トークンのみが格納されます。クエリの一部としてファセットを返すためにExpandOptionsを使う場合、そのデータはxDBインデックスではなく[xDBコレクションデータベース](https://doc.sitecore.com/xp/en/developers/100/platform-administration-and-architecture/xdb-collection-database.html) から来ています。

xConnectは個人識別情報(PII)コンプライアンスを強制する仕組みを提供しますが、使用するかどうかは自分で決める必要があります。ファセットやプロパティがPIISensitiveとマークされている場合、それはインデックス化されておらず、検索もできません。たとえ名前で検索できなくても、連絡先のファーストネームなどのPII機密データを返すことは可能です。

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

-   Search連絡先
-   Search インタラクション

> !注Sitecore 9.1.0のSitecore.Xdb.Common.Web名前空間では:
> 
> -   Certificate\*\*WebRequest\*\*HandlerModifierOptionsCertificate\*\*HttpClient\*\*HandlerModifierOptionsになった。
>     
> -   Certificate\*\*WebRequest\*\*HandlerModifierCertificate\*\*HttpClient\*\*HandlerModifierになった。
>     

## 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.](https://doc.sitecore.com/api/markdown-image/xp/ja/developers/93/sitecore-experience-platform/images/console-works-71.png)
    
    > !注数字は、前のウォークスルーでプログラムをいつ何回実行したかによって異なります。
    

## 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.](https://doc.sitecore.com/api/markdown-image/xp/ja/developers/93/sitecore-experience-platform/images/xconnect-tutorial-4-5.png)
    

次のウォークスルーで [カスタムファセットやイベントの作成](https://doc.sitecore.com/xp/ja/developers/93/sitecore-experience-platform/walkthrough--creating-custom-facets-and-events.html "Walkthrough: Creating custom facets and events")方法を学びましょう。