ヒストグラムフィールドタイプ

ヒストグラムを表す事前集計された数値データを格納するフィールドです。このデータは、2つのペア配列を使用して定義されます:

  • ヒストグラムのバケットを表す values 配列の double 数値。これらの値は昇順で提供される必要があります。
  • 各バケットに該当する値の数を表す対応する counts 配列の long 数値。これらの数値は正またはゼロでなければなりません。

values 配列の要素は count 配列の同じ位置の要素に対応するため、これら2つの配列は同じ長さでなければなりません。

  • histogram フィールドは、ドキュメントごとに単一の values および count 配列のペアのみを格納できます。ネストされた配列はサポートされていません。
  • histogram フィールドはソートをサポートしていません。

使用例

histogram フィールドは主に集計での使用を目的としています。集計に対してよりアクセスしやすくするために、histogram フィールドデータはバイナリ doc values として保存され、インデックスされません。そのサイズは最大で 13 * numValues バイトで、numValues は提供された配列の長さです。

データがインデックスされていないため、histogram フィールドは次の集計およびクエリにのみ使用できます:

ヒストグラムの構築

集計の一部としてヒストグラムを使用する場合、結果の精度はヒストグラムの構築方法に依存します。ヒストグラムを構築するために使用されるパーセンタイル集計モードを考慮することが重要です。いくつかの可能性には次のものが含まれます:

  • T-Digest モードでは、values 配列は平均セントロイド位置を表し、counts 配列は各セントロイドに帰属する値の数を表します。アルゴリズムがすでにパーセンタイルを近似し始めている場合、この不正確さはヒストグラムに引き継がれます。
  • High Dynamic Range (HDR) ヒストグラムモードでは、values 配列は各バケット区間の固定上限を表し、counts 配列は各区間に帰属する値の数を表します。この実装は、固定の最悪ケースのパーセンテージ誤差(指定された有効桁数として)を維持します。したがって、ヒストグラムを生成する際に使用される値は、集計時に達成できる最大の精度となります。

ヒストグラムフィールドは「アルゴリズムに依存しない」とされ、T-Digest または HDRHistogram のいずれかに特有のデータを保存しません。これは、フィールドが技術的にはどちらのアルゴリズムでも集計できることを意味しますが、実際にはユーザーは1つのアルゴリズムを選択し、その方法でデータをインデックスする必要があります(例:T-Digest のセントロイドまたは HDRHistogram の区間)最良の精度を確保するために。

合成 _source

合成 _source は、一般的に TSDB インデックス(index.modetime_series に設定されているインデックス)でのみ利用可能です。他のインデックスでは、合成 _source は技術プレビュー中です。技術プレビュー中の機能は、将来のリリースで変更または削除される可能性があります。Elastic は問題を修正するために作業しますが、技術プレビュー中の機能は公式 GA 機能のサポート SLA の対象ではありません。

histogram フィールドは、デフォルト構成で 合成 _source をサポートします。合成 _source は、copy_to と一緒に使用することはできません。

スペースを節約するために、ゼロカウントバケットはヒストグラムの doc values に保存されません。その結果、合成ソースが有効なインデックスでヒストグラムフィールドをインデックスする際に、ゼロカウントバケットを含むヒストグラムをインデックスすると、ヒストグラムを取得する際にバケットが欠落することになります。

次の インデックス作成 API リクエストは、2つのフィールドマッピングを持つ新しいインデックスを作成します:

  • my_histogram、パーセンタイルデータを格納するために使用される histogram フィールド
  • my_text、ヒストグラムのタイトルを格納するために使用される keyword フィールド

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "properties": {
  5. "my_histogram": {
  6. "type": "histogram"
  7. },
  8. "my_text": {
  9. "type": "keyword"
  10. }
  11. }
  12. },
  13. )
  14. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. properties: {
  6. my_histogram: {
  7. type: 'histogram'
  8. },
  9. my_text: {
  10. type: 'keyword'
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. properties: {
  5. my_histogram: {
  6. type: "histogram",
  7. },
  8. my_text: {
  9. type: "keyword",
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings" : {
  4. "properties" : {
  5. "my_histogram" : {
  6. "type" : "histogram"
  7. },
  8. "my_text" : {
  9. "type" : "keyword"
  10. }
  11. }
  12. }
  13. }

次の インデックス API リクエストは、2つのヒストグラムのために事前集計されたデータを保存します: histogram_1histogram_2

Python

  1. resp = client.index(
  2. index="my-index-000001",
  3. id="1",
  4. document={
  5. "my_text": "histogram_1",
  6. "my_histogram": {
  7. "values": [
  8. 0.1,
  9. 0.2,
  10. 0.3,
  11. 0.4,
  12. 0.5
  13. ],
  14. "counts": [
  15. 3,
  16. 7,
  17. 23,
  18. 12,
  19. 6
  20. ]
  21. }
  22. },
  23. )
  24. print(resp)
  25. resp1 = client.index(
  26. index="my-index-000001",
  27. id="2",
  28. document={
  29. "my_text": "histogram_2",
  30. "my_histogram": {
  31. "values": [
  32. 0.1,
  33. 0.25,
  34. 0.35,
  35. 0.4,
  36. 0.45,
  37. 0.5
  38. ],
  39. "counts": [
  40. 8,
  41. 17,
  42. 8,
  43. 7,
  44. 6,
  45. 2
  46. ]
  47. }
  48. },
  49. )
  50. print(resp1)

Ruby

  1. response = client.index(
  2. index: 'my-index-000001',
  3. id: 1,
  4. body: {
  5. my_text: 'histogram_1',
  6. my_histogram: {
  7. values: [
  8. 0.1,
  9. 0.2,
  10. 0.3,
  11. 0.4,
  12. 0.5
  13. ],
  14. counts: [
  15. 3,
  16. 7,
  17. 23,
  18. 12,
  19. 6
  20. ]
  21. }
  22. }
  23. )
  24. puts response
  25. response = client.index(
  26. index: 'my-index-000001',
  27. id: 2,
  28. body: {
  29. my_text: 'histogram_2',
  30. my_histogram: {
  31. values: [
  32. 0.1,
  33. 0.25,
  34. 0.35,
  35. 0.4,
  36. 0.45,
  37. 0.5
  38. ],
  39. counts: [
  40. 8,
  41. 17,
  42. 8,
  43. 7,
  44. 6,
  45. 2
  46. ]
  47. }
  48. }
  49. )
  50. puts response

Js

  1. const response = await client.index({
  2. index: "my-index-000001",
  3. id: 1,
  4. document: {
  5. my_text: "histogram_1",
  6. my_histogram: {
  7. values: [0.1, 0.2, 0.3, 0.4, 0.5],
  8. counts: [3, 7, 23, 12, 6],
  9. },
  10. },
  11. });
  12. console.log(response);
  13. const response1 = await client.index({
  14. index: "my-index-000001",
  15. id: 2,
  16. document: {
  17. my_text: "histogram_2",
  18. my_histogram: {
  19. values: [0.1, 0.25, 0.35, 0.4, 0.45, 0.5],
  20. counts: [8, 17, 8, 7, 6, 2],
  21. },
  22. },
  23. });
  24. console.log(response1);

コンソール

  1. PUT my-index-000001/_doc/1
  2. {
  3. "my_text" : "histogram_1",
  4. "my_histogram" : {
  5. "values" : [0.1, 0.2, 0.3, 0.4, 0.5],
  6. "counts" : [3, 7, 23, 12, 6]
  7. }
  8. }
  9. PUT my-index-000001/_doc/2
  10. {
  11. "my_text" : "histogram_2",
  12. "my_histogram" : {
  13. "values" : [0.1, 0.25, 0.35, 0.4, 0.45, 0.5],
  14. "counts" : [8, 17, 8, 7, 6, 2]
  15. }
  16. }
各バケットの値。配列内の値はダブルとして扱われ、昇順で与えられる必要があります。 T-Digest
ヒストグラムでは、この値は平均値を表します。HDR ヒストグラムの場合、この値は反復された値を表します。
各バケットのカウント。配列内の値は長整数として扱われ、正またはゼロでなければなりません。
負の値は拒否されます。バケットとカウントの関係は配列内の位置によって示されます。