このページでは、データフィールド名を更新する方法について説明します。
展開環境でこの手順を適切に使用するには、次のガイドラインに従ってください。
デプロイ | バージョン | 必須のアクション |
---|
SaaS | 4.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.c
、transit
.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 つのルールに従うことによって回避できます。
- フィールド名では連続する複数のドットを使用できない
- フィールド名では最初と最後にドットを使用できない
- フィールド名では同じプレフィックスを使用できない
これらのルールについて以下に説明します。
フィールド名では連続する複数のドットを使用できない
連続する複数のドットが含まれているフィールド名は、一部の要素の名前が空の文字列である構造体に展開されます。そのような構造体は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,
」内でネストされる必要があるため、マッピングに失敗します。