---
title: "バッチインデックス"
slug: "batch-indexing"
abstract: "バッチインデックスの動作やSyncTokenの保存・使用方法についても教えてください。"
---
# バッチインデックス

xConnectはバッチがxConnectに提出されるたびにストレージ層の同期トークンを増分します。クライアントのSyncTokenプロパティが検索時に設定されている場合、インデックスがその数に追いついた場合にのみ結果が返されます。

> !重要検索結果が返される際にすべてのバッチがインデックス化されている保証は、クライアントインスタンスにローカルで行われます。並列スレッドでxConnectにデータを提出すると、クライアントAがクライアントBより先に検索結果を返すことがあります。

最新の同期トークンはバッチの結果とともにクライアントに返されます:

await client.SubmitAsync();

var searchSynchronizationToken = client.SyncToken;

> !注デバイスプロファイルには変更追跡が有効になっていません。

10,000件の連絡先を5バッチ送信した場合、インデックス作業者が5回目のバッチまでの変更をインデックス化した時点で、その10,000件の連絡先のインデックス作成は完了します。このバッチは特定の同期トークンで表されます。50,000件の連絡先のインデックス作成が完了したことを確認するために:

1.  5回のバッチを提出してください。
2.  最終バッチで返される SyncToken への参照を保存します。例えば、List Managerはリスト定義項目に同期トークンを保存します。
3.  インデックスが完了しているかどうかを確認するコードで、 SyncToken プロパティを保存トークンに設定します。
4.  このクライアントを使ってダミーサーチを実行してください。インデックス作成が提供された同期トークンに追いついた場合にのみ結果が返されます。

何を検索しても、インデックスが指定された数以上に達するまで結果は返されません。 SyncTokenがnullであれば、結果は即座に返されます。クライアントは特定の同期トークンにインデックスが追いつくのを待つ必要がありません。

## シナリオ:SyncTokenを保存して使用する場合

次のシナリオでは、**xConnectクライアントA**が多数の連絡先を追加し、ListSubscriptionsファセットを設定して新しいリストに登録します。別のページでは **、xConnectクライアントB**が連絡先検索を使ってそのリスト内のすべての連絡先を返しています。しかし、クライアントBのSyncTokenプロパティが設定されていないため、インデックスが完了する前に結果が返され、結果カウントが正確でなくなります。

![Two separate operations on contacts could conflict if you don't use a sync token](https://doc.sitecore.com/api/markdown-image/xp/ja/developers/105/sitecore-experience-platform/images/sync-token-11.png)

インデックス作成が完了したときにだけ結果が返されるようにするために、返された返SyncTokenをクライアントAに保存してください。例えば、リストIDのSQLテーブルと、そのリストに追加される最新の連絡先の同期トークンを管理できます。

ジョブID

サブスクリプションリスト ID

シンクトークン

1

A256FE54-9915-4779-AFE1-511B74795DDE

6e26FE54-9915-4779-afe1-511b74795dde

検索を行う前に、SyncTokenプロパティを示された保存値に設定してください。インデックス作成が完了するまで結果は返されません。

using Sitecore.XConnect;
using Sitecore.XConnect.Client;
using Sitecore.XConnect.Collection.Model;
using System;
using System.Linq;

namespace Documentation
{
 public class ChangeTracking
 {
 // Async example
 public async void ExampleAsync()
 {
 using (XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
 {
 // Manually set sync token
 client.SyncToken = Guid.Parse("6e26fe54-9915-4779-afe1-511b74795dde").ToByteArray();

 try
 {
 var listId = Guid.Parse("a256fe54-9915-4779-afe1-511b74795dde");
 var query = client.Contacts.Where(c => c.ListSubscriptions().Subscriptions.Any(s => s.ListDefinitionId == listId));

 // Will only return results when indexing is complete
 var results = await query.GetBatchEnumerator();
 }
 catch (XdbExecutionException ex)
 {
 // Handle exception or timeout
 }
 }
 }

 // Sync Example
 public void ExampleSync()
 {
 using (XConnectClient client = Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient())
 {
 // Manually set sync token
 client.SyncToken = Guid.Parse("6e26fe54-9915-4779-afe1-511b74795dde").ToByteArray();

 try
 {
 var listId = Guid.Parse("a256fe54-9915-4779-afe1-511b74795dde");
 var query = client.Contacts.Where(c => c.ListSubscriptions().Subscriptions.Any(s => s.ListDefinitionId == listId));

 // Will only return results when indexing is complete
 var results = query.GetBatchEnumeratorSync();
 }
 catch (XdbExecutionException ex)
 {
 // Handle exception or timeout
 }
 }
 }
 }
}