複数の言語を持つセグメントが集計されない


説明

エクスペリエンス アナリティクスのレポートにおいて、セグメント アイテムに複数の言語バージョンがある場合、実際のデータが表示されない恐れがあります。この事象は、スケールされたトポロジー(XP1)でSitecore XPを実行している場合に発生します。事象が発生した場合、Processingサーバのログに下記のエラー メッセージが出力されます:

ERROR Aggregation Error
Exception: System.ArgumentException
Message: An item with the same key has already been added.
Source: mscorlib
   at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
   at System.Linq.Enumerable.ToDictionary[TSource,TKey](IEnumerable`1 source, Func`2 keySelector)
   at Sitecore.ExperienceAnalytics.Core.Repositories.MarketingSegmentReaderBase`1.GetAll(CultureInfo cultureInfo, NameValueCollection readingPreferences)
   at Sitecore.ExperienceAnalytics.Aggregation.Pipeline.MarketingSegmentationProcessor.GetSegments()
   at Sitecore.ExperienceAnalytics.Aggregation.Pipeline.MarketingSegmentationProcessor.Process(InteractionAggregationPipelineArgs args)
   at (Object , Object )
   at Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args)
   at Sitecore.Pipelines.DefaultCorePipelineManager.Run(String pipelineName, PipelineArgs args, String pipelineDomain, Boolean failIfNotExists)
   at Sitecore.Pipelines.DefaultCorePipelineManager.Run(String pipelineName, PipelineArgs args, String pipelineDomain)
   at Sitecore.ExperienceAnalytics.Aggregation.Pipeline.InteractionProcessor.OnProcess(InteractionAggregationPipelineArgs args)
   at Sitecore.Analytics.Aggregation.Pipeline.InteractionAggregationPipelineProcessor.Process(InteractionAggregationPipelineArgs args)

この問題は、以下の2つの場合に発生します:

解決策

本事象を解決するには、以下の手順に従って実施してください:

  1. 下記のクエリをReferenceDataデータベースに対して実行し、複数の言語バージョンが存在しているかを確認します。
    select dc.*
      from [xdb_refdata].[Definitions] as d
      join [xdb_refdata].[DefinitionCultures] as dc
        on d.ID = dc.DefinitionVersionID
     where d.Moniker in
     (
        'cd0b4c6b-8c41-4eba-bc10-b936b29303e7', -- Computer
        '0df6797e-ee1b-4bfd-9262-0471b1add438', -- Mobile Phone
        'ecd9a3d4-f549-487a-93aa-1ea3cf0477e5'  -- Tablet
     )
       and dc.Culture != 'en';
  2. コンテンツ エディターにおいて、/sitecore/system/Marketing Control Panel/Segmentsフォルダ配下の該当するアイテムの英語バージョン以外の言語バージョンを削除します。
  3. ReferenceDataデータベースのバックアップを実施します。
  4. 下記のクエリをReferenceDataデータベースに対して実行します:
    DELETE
    FROM [xdb_refdata].[DefinitionCultures]
    where ID in (
    select dc.ID
    from [xdb_refdata].[Definitions] as d
    join [xdb_refdata].[DefinitionCultures] as dc
    on d.ID = dc.DefinitionVersionID
    where d.Moniker in
    (
    'cd0b4c6b-8c41-4eba-bc10-b936b29303e7', -- Computer
    '0df6797e-ee1b-4bfd-9262-0471b1add438', -- Mobile Phone
    'ecd9a3d4-f549-487a-93aa-1ea3cf0477e5' -- Tablet
    )
    and dc.Culture != 'en')