eager_global_ordinals

What are global ordinals?

グローバルオーディナルとは何ですか?Elasticsearchは、ドキュメントごとにフィールド値を検索する必要がある集計やその他の操作をサポートするために、doc valuesと呼ばれるデータ構造を使用します。keywordのような用語ベースのフィールドタイプは、よりコンパクトな表現のためにオーディナルマッピングを使用してdoc valuesを保存します。このマッピングは、各用語にその辞書順に基づいて増分整数またはオーディナルを割り当てることによって機能します。フィールドのdoc valuesは、元の用語の代わりに各ドキュメントのオーディナルのみを保存し、オーディナルと用語の間を変換するための別のルックアップ構造を持っています。

集計中に使用されると、オーディナルはパフォーマンスを大幅に向上させることができます。例えば、terms集計は、シャードレベルでドキュメントをバケットに集めるためにオーディナルのみを使用し、結果をシャード間で結合する際にオーディナルを元の用語値に戻します。

各インデックスセグメントは独自のオーディナルマッピングを定義しますが、集計は全シャードにわたってデータを収集します。したがって、集計のようなシャードレベルの操作にオーディナルを使用できるようにするために、Elasticsearchはグローバルオーディナルと呼ばれる統一マッピングを作成します。グローバルオーディナルマッピングは、セグメントオーディナルの上に構築され、各セグメントのローカルオーディナルへのマップを維持することによって機能します。

グローバルオーディナルは、検索に次のいずれかのコンポーネントが含まれている場合に使用されます:

  • keywordip、およびflattenedフィールドに対する特定のバケット集計。これには、上記のterms集計や、compositediversified_samplersignificant_termsが含まれます。
  • fielddataを有効にする必要があるtextフィールドに対するバケット集計。
  • joinフィールドからの親子ドキュメントに対する操作、has_childクエリおよびparent集計を含みます。

グローバルオーディナルマッピングは、フィールドデータキャッシュの一部としてヒープメモリを使用します。高カーディナリティフィールドに対する集計は、多くのメモリを使用し、フィールドデータサーキットブレーカーをトリガーする可能性があります。

Loading global ordinals

グローバルオーディナルマッピングは、検索中にオーディナルを使用する前に構築されなければなりません。デフォルトでは、グローバルオーディナルが必要とされる最初の検索中にマッピングがロードされます。これはインデックス速度を最適化する場合には適切なアプローチですが、検索パフォーマンスが優先される場合は、集計に使用されるフィールドのグローバルオーディナルを積極的にロードすることをお勧めします:

Python

  1. resp = client.indices.put_mapping(
  2. index="my-index-000001",
  3. properties={
  4. "tags": {
  5. "type": "keyword",
  6. "eager_global_ordinals": True
  7. }
  8. },
  9. )
  10. print(resp)

Ruby

  1. response = client.indices.put_mapping(
  2. index: 'my-index-000001',
  3. body: {
  4. properties: {
  5. tags: {
  6. type: 'keyword',
  7. eager_global_ordinals: true
  8. }
  9. }
  10. }
  11. )
  12. puts response

Js

  1. const response = await client.indices.putMapping({
  2. index: "my-index-000001",
  3. properties: {
  4. tags: {
  5. type: "keyword",
  6. eager_global_ordinals: true,
  7. },
  8. },
  9. });
  10. console.log(response);

Console

  1. PUT my-index-000001/_mapping
  2. {
  3. "properties": {
  4. "tags": {
  5. "type": "keyword",
  6. "eager_global_ordinals": true
  7. }
  8. }
  9. }
  1. 積極的なロードは、`````eager_global_ordinals`````設定を更新することでいつでも無効にできます:
  2. #### Python
  3. ``````python
  4. resp = client.indices.put_mapping(
  5. index="my-index-000001",
  6. properties={
  7. "tags": {
  8. "type": "keyword",
  9. "eager_global_ordinals": False
  10. }
  11. },
  12. )
  13. print(resp)
  14. `

Ruby

  1. response = client.indices.put_mapping(
  2. index: 'my-index-000001',
  3. body: {
  4. properties: {
  5. tags: {
  6. type: 'keyword',
  7. eager_global_ordinals: false
  8. }
  9. }
  10. }
  11. )
  12. puts response

Js

  1. const response = await client.indices.putMapping({
  2. index: "my-index-000001",
  3. properties: {
  4. tags: {
  5. type: "keyword",
  6. eager_global_ordinals: false,
  7. },
  8. },
  9. });
  10. console.log(response);

Console

  1. PUT my-index-000001/_mapping
  2. {
  3. "properties": {
  4. "tags": {
  5. "type": "keyword",
  6. "eager_global_ordinals": false
  7. }
  8. }
  9. }

Avoiding global ordinal loading

通常、グローバルオーディナルは、そのロード時間とメモリ使用量の観点から大きなオーバーヘッドを示しません。しかし、グローバルオーディナルのロードは、大きなシャードを持つインデックスや、フィールドに多数のユニークな用語値が含まれている場合には高コストになる可能性があります。グローバルオーディナルは、シャード上のすべてのセグメントに対する統一マッピングを提供するため、新しいセグメントが可視化されるときに完全に再構築する必要があります。

場合によっては、グローバルオーディナルのロードを完全に回避することが可能です:

  • termssampler、およびsignificant_terms集計は、バケットの収集方法を制御するのに役立つパラメータexecution_hintをサポートしています。デフォルトではglobal_ordinalsですが、mapに設定することで用語値を直接使用することができます。
  • シャードが強制マージされて単一のセグメントにダウンされている場合、そのセグメントオーディナルはすでにシャードに対してグローバルです。この場合、Elasticsearchはグローバルオーディナルマッピングを構築する必要がなく、グローバルオーディナルを使用することによる追加のオーバーヘッドはありません。パフォーマンス上の理由から、再度書き込むことがないインデックスを強制的にマージすることをお勧めします。