このページでは、データフィールド名を更新する方法について説明します。

展開環境でこの手順を適切に使用するには、次のガイドラインに従ってください。

デプロイバージョン必須のアクション
SaaS4.5.3 以降次の説明に従って、データフィールド名を更新します。
オンプレミス4.5.2 以前処置は必要ありませんが、将来のイベントサービスリリースの準備のためにデータフィールド名を更新することを強く推奨します。

更新の概要

バージョン4.5.3のイベントサービスではElasticsearch 5.6が実行されますが、それより前のイベントサービスでは5.6より前のバージョンのElasticsearchが実行されます。イベントサービス4.5.3にアップグレードするには、トランザクション分析、ログ分析、または他のタイプのデータの収集に使用していた一部のフィールド名の変更が必要になる場合があります。

以下の要件を確認し、該当する場合はステップに従ってください。この変更の理論的根拠を把握するには、「フィールド名に関する詳細」を参照してください。

要件

空のフィールド名を使用しない

5.6より前のバージョンのElasticsearchでは、名前が空であるフィールドを作成できていました。そのような名前は使用できなくなりました。空のフィールド名を使用するとインデックス作成でエラーが発生するようになっています。

Required action:名前が空であるすべてのフィールドに英数字の名前を付けます。

フィールド名ではドットを使用しない

これまでは、ドットを使用して名前のコンポーネントを意味的に分離するユーザーもいました。この方法は推奨されなくなったため、Events Service 4.5.3 へのアップグレードが失敗する可能性があります。

Strongly recommended action:フィールド名内のドットをハイフンまたはアンダースコアで置き換えます。 

フィールド名に関する詳細

このセクションでは、ドット形式のフィールド名、つまりピリオド(「.」)が埋め込まれているフィールド名について説明します(例:a.b.ctransit.signals.yellow)。

Elasticsearch は、構造が階層型である JSON ドキュメントにデータを保存します。ドット付きフィールド名は、これらの JSON ドキュメントへのクエリに使用できます。フィールド名は、コンポーネントがドットで区切られたパスとして処理されます。https://www.elastic.co/guide/en/elasticsearch/reference/2.4/dots-in-names.html を参照してください。

ドット形式のフィールド名がJSON要素のパスとして使用されているのか、単純なフィールド名なのかを区別できないことがあります。この問題を一貫した方法で扱うために、バージョン 5.6 以降の Elasticsearch では、ドット形式のフィールド名は常に階層型の JSON 構造体に自動的に展開されます。ドットごとに、ネストした別のレベルが下位の階層内に作成されます。

イベントサービス4.5.3では、フィールド名に含まれるドットを正常に処理するように試行され、Elasticsearchのデフォルトの挙動が許可されています。ただし、一部の場合、Elasticsearch がフィールド名に対応するイベントのインデックスを作成できません。その場合には、フィールド名を変更することが唯一の解決方法です。

このような状況は、次の 3 つのルールに従うことによって回避できます。

  1. フィールド名では連続する複数のドットを使用できない
  2. フィールド名では最初と最後にドットを使用できない
  3. フィールド名では同じプレフィックスを使用できない

これらのルールについて以下に説明します。

フィールド名では連続する複数のドットを使用できない

連続する複数のドットが含まれているフィールド名は、一部の要素の名前が空の文字列である構造体に展開されます。そのような構造体はJSONオブジェクトとして無効です。次の例では、最も深くネストされているノードの名前が空であることが分かります。

"a.very.long.field.name.truncated.with.dots..." ->
"a": {
  "very": {
    "long": {
      "field": { 
        "name": { 
          "truncated": {
            "with": { 
              "dots": {
                "": {
                 "": { 
                  "": {
                    }
                  }
                }
              }
            }
          }
        }
      }
    } 
  }
}
JS


フィールド名では最初と最後にドットを使用できない

最初または最後がドットであるフィールド名は、一部の要素の名前が空の文字列である構造体に展開されます。そのような構造体はJSONオブジェクトとして無効です。 {{2}}は特定の属性を識別し、 {{3}} はこの属性に割り当てる新規の値を指定します。

".a.b.c" ->
"": {
  "a": {
    "b": {
      "c": "value of field"
    }
  }
}
 
 
"a.b.c." ->
"a": {
  "b" : {
    "c": {
      "" : {
      }
    }
  }
}
JS


フィールド名
では同じプレフィックスを使用できない

2 つ以上のフィールド名のプレフィックスが同じである場合、それらのすべての名前に対して有効な JSON オブジェクトを作成することが不可能になります。 

次のフィールド名と値について考えてみます。

a.b = "alphabaker"

a.b.c = "alphabakercharlie"

同じプレフィックスを使用すると問題が発生します。その原因は次のとおりです。

  • 作成する必要があるノードはすべてテキストノードであり、
  • 一部のノードはネストする必要がある。しかし、
  • JSON で、テキストノードに他のオブジェクトを含めることはできない。

この例のための JSON オブジェクトを Elasticsearch が作成しようとしたときに何が起こるのかを調べることで、この問題を明らかにします。 

  • 最初のフィールド名では、「b」は値がalphabaker」であるテキストノードにマップされます。
"a": {
  "b": = "alphabaker"
}
JS
  • 2 番目の名前を展開するために、Elasticsearch は「c」を、値がalphabakercharlie.」であるテキストノードにマップしようとします。しかし、c」は、テキストノードであり、ネストしたオブジェクトを含むことができないb,」内でネストされる必要があるため、マッピングに失敗します。