eager_global_ordinals
What are global ordinals?
グローバルオーディナルとは何ですか?Elasticsearchは、ドキュメントごとにフィールド値を検索する必要がある集計やその他の操作をサポートするために、doc valuesと呼ばれるデータ構造を使用します。keyword
のような用語ベースのフィールドタイプは、よりコンパクトな表現のためにオーディナルマッピングを使用してdoc valuesを保存します。このマッピングは、各用語にその辞書順に基づいて増分整数またはオーディナルを割り当てることによって機能します。フィールドのdoc valuesは、元の用語の代わりに各ドキュメントのオーディナルのみを保存し、オーディナルと用語の間を変換するための別のルックアップ構造を持っています。
集計中に使用されると、オーディナルはパフォーマンスを大幅に向上させることができます。例えば、terms
集計は、シャードレベルでドキュメントをバケットに集めるためにオーディナルのみを使用し、結果をシャード間で結合する際にオーディナルを元の用語値に戻します。
各インデックスセグメントは独自のオーディナルマッピングを定義しますが、集計は全シャードにわたってデータを収集します。したがって、集計のようなシャードレベルの操作にオーディナルを使用できるようにするために、Elasticsearchはグローバルオーディナルと呼ばれる統一マッピングを作成します。グローバルオーディナルマッピングは、セグメントオーディナルの上に構築され、各セグメントのローカルオーディナルへのマップを維持することによって機能します。
グローバルオーディナルは、検索に次のいずれかのコンポーネントが含まれている場合に使用されます:
keyword
、ip
、およびflattened
フィールドに対する特定のバケット集計。これには、上記のterms
集計や、composite
、diversified_sampler
、significant_terms
が含まれます。fielddata
を有効にする必要があるtext
フィールドに対するバケット集計。join
フィールドからの親子ドキュメントに対する操作、has_child
クエリおよびparent
集計を含みます。
グローバルオーディナルマッピングは、フィールドデータキャッシュの一部としてヒープメモリを使用します。高カーディナリティフィールドに対する集計は、多くのメモリを使用し、フィールドデータサーキットブレーカーをトリガーする可能性があります。
Loading global ordinals
グローバルオーディナルマッピングは、検索中にオーディナルを使用する前に構築されなければなりません。デフォルトでは、グローバルオーディナルが必要とされる最初の検索中にマッピングがロードされます。これはインデックス速度を最適化する場合には適切なアプローチですが、検索パフォーマンスが優先される場合は、集計に使用されるフィールドのグローバルオーディナルを積極的にロードすることをお勧めします:
Python
resp = client.indices.put_mapping(
index="my-index-000001",
properties={
"tags": {
"type": "keyword",
"eager_global_ordinals": True
}
},
)
print(resp)
Ruby
response = client.indices.put_mapping(
index: 'my-index-000001',
body: {
properties: {
tags: {
type: 'keyword',
eager_global_ordinals: true
}
}
}
)
puts response
Js
const response = await client.indices.putMapping({
index: "my-index-000001",
properties: {
tags: {
type: "keyword",
eager_global_ordinals: true,
},
},
});
console.log(response);
Console
PUT my-index-000001/_mapping
{
"properties": {
"tags": {
"type": "keyword",
"eager_global_ordinals": true
}
}
}
積極的なロードは、`````eager_global_ordinals`````設定を更新することでいつでも無効にできます:
#### Python
``````python
resp = client.indices.put_mapping(
index="my-index-000001",
properties={
"tags": {
"type": "keyword",
"eager_global_ordinals": False
}
},
)
print(resp)
`
Ruby
response = client.indices.put_mapping(
index: 'my-index-000001',
body: {
properties: {
tags: {
type: 'keyword',
eager_global_ordinals: false
}
}
}
)
puts response
Js
const response = await client.indices.putMapping({
index: "my-index-000001",
properties: {
tags: {
type: "keyword",
eager_global_ordinals: false,
},
},
});
console.log(response);
Console
PUT my-index-000001/_mapping
{
"properties": {
"tags": {
"type": "keyword",
"eager_global_ordinals": false
}
}
}
Avoiding global ordinal loading
通常、グローバルオーディナルは、そのロード時間とメモリ使用量の観点から大きなオーバーヘッドを示しません。しかし、グローバルオーディナルのロードは、大きなシャードを持つインデックスや、フィールドに多数のユニークな用語値が含まれている場合には高コストになる可能性があります。グローバルオーディナルは、シャード上のすべてのセグメントに対する統一マッピングを提供するため、新しいセグメントが可視化されるときに完全に再構築する必要があります。
場合によっては、グローバルオーディナルのロードを完全に回避することが可能です:
terms
、sampler
、およびsignificant_terms
集計は、バケットの収集方法を制御するのに役立つパラメータexecution_hint
をサポートしています。デフォルトではglobal_ordinals
ですが、map
に設定することで用語値を直接使用することができます。- シャードが強制マージされて単一のセグメントにダウンされている場合、そのセグメントオーディナルはすでにシャードに対してグローバルです。この場合、Elasticsearchはグローバルオーディナルマッピングを構築する必要がなく、グローバルオーディナルを使用することによる追加のオーバーヘッドはありません。パフォーマンス上の理由から、再度書き込むことがないインデックスを強制的にマージすることをお勧めします。