日付範囲集計

日付値専用の範囲集計です。この集計と通常の 範囲 集計との主な違いは、from および to の値が 日付数学 表現で表現できること、また from および to の応答フィールドが返される日付形式を指定できることです。この集計には、各範囲の from 値が含まれ、to 値は除外されます。

例:

Python

  1. resp = client.search(
  2. index="sales",
  3. size="0",
  4. aggs={
  5. "range": {
  6. "date_range": {
  7. "field": "date",
  8. "format": "MM-yyyy",
  9. "ranges": [
  10. {
  11. "to": "now-10M/M"
  12. },
  13. {
  14. "from": "now-10M/M"
  15. }
  16. ]
  17. }
  18. }
  19. },
  20. )
  21. print(resp)

Ruby

  1. response = client.search(
  2. index: 'sales',
  3. size: 0,
  4. body: {
  5. aggregations: {
  6. range: {
  7. date_range: {
  8. field: 'date',
  9. format: 'MM-yyyy',
  10. ranges: [
  11. {
  12. to: 'now-10M/M'
  13. },
  14. {
  15. from: 'now-10M/M'
  16. }
  17. ]
  18. }
  19. }
  20. }
  21. }
  22. )
  23. puts response

Js

  1. const response = await client.search({
  2. index: "sales",
  3. size: 0,
  4. aggs: {
  5. range: {
  6. date_range: {
  7. field: "date",
  8. format: "MM-yyyy",
  9. ranges: [
  10. {
  11. to: "now-10M/M",
  12. },
  13. {
  14. from: "now-10M/M",
  15. },
  16. ],
  17. },
  18. },
  19. },
  20. });
  21. console.log(response);

コンソール

  1. POST /sales/_search?size=0
  2. {
  3. "aggs": {
  4. "range": {
  5. "date_range": {
  6. "field": "date",
  7. "format": "MM-yyyy",
  8. "ranges": [
  9. { "to": "now-10M/M" },
  10. { "from": "now-10M/M" }
  11. ]
  12. }
  13. }
  14. }
  15. }
現在から10か月前の月の初めに切り捨てられた日付。
現在から10か月前の月の初めに切り捨てられた日付以上。

上記の例では、2つの範囲バケットを作成しました。最初のバケットは10か月前の日付より前の日付のすべてのドキュメントを「バケット」し、2番目のバケットは10か月前以降の日付のすべてのドキュメントを「バケット」します。

応答:

コンソール-結果

  1. {
  2. ...
  3. "aggregations": {
  4. "range": {
  5. "buckets": [
  6. {
  7. "to": 1.4436576E12,
  8. "to_as_string": "10-2015",
  9. "doc_count": 7,
  10. "key": "*-10-2015"
  11. },
  12. {
  13. "from": 1.4436576E12,
  14. "from_as_string": "10-2015",
  15. "doc_count": 0,
  16. "key": "10-2015-*"
  17. }
  18. ]
  19. }
  20. }
  21. }

日付形式または日付値が不完全な場合、日付範囲集計は欠落しているコンポーネントをデフォルト値で置き換えます。欠落した日付コンポーネントを参照してください。

欠落値

missing パラメータは、値が欠落しているドキュメントがどのように扱われるべきかを定義します。デフォルトでは無視されますが、値があるかのように扱うことも可能です。これは、フィールドごとにデフォルト値を指定するためのフィールド名: 値のマッピングを追加することで行われます。

Python

  1. resp = client.search(
  2. index="sales",
  3. size="0",
  4. aggs={
  5. "range": {
  6. "date_range": {
  7. "field": "date",
  8. "missing": "1976/11/30",
  9. "ranges": [
  10. {
  11. "key": "Older",
  12. "to": "2016/02/01"
  13. },
  14. {
  15. "key": "Newer",
  16. "from": "2016/02/01",
  17. "to": "now/d"
  18. }
  19. ]
  20. }
  21. }
  22. },
  23. )
  24. print(resp)

Ruby

  1. response = client.search(
  2. index: 'sales',
  3. size: 0,
  4. body: {
  5. aggregations: {
  6. range: {
  7. date_range: {
  8. field: 'date',
  9. missing: '1976/11/30',
  10. ranges: [
  11. {
  12. key: 'Older',
  13. to: '2016/02/01'
  14. },
  15. {
  16. key: 'Newer',
  17. from: '2016/02/01',
  18. to: 'now/d'
  19. }
  20. ]
  21. }
  22. }
  23. }
  24. }
  25. )
  26. puts response

Js

  1. const response = await client.search({
  2. index: "sales",
  3. size: 0,
  4. aggs: {
  5. range: {
  6. date_range: {
  7. field: "date",
  8. missing: "1976/11/30",
  9. ranges: [
  10. {
  11. key: "Older",
  12. to: "2016/02/01",
  13. },
  14. {
  15. key: "Newer",
  16. from: "2016/02/01",
  17. to: "now/d",
  18. },
  19. ],
  20. },
  21. },
  22. },
  23. });
  24. console.log(response);

コンソール

  1. POST /sales/_search?size=0
  2. {
  3. "aggs": {
  4. "range": {
  5. "date_range": {
  6. "field": "date",
  7. "missing": "1976/11/30",
  8. "ranges": [
  9. {
  10. "key": "Older",
  11. "to": "2016/02/01"
  12. },
  13. {
  14. "key": "Newer",
  15. "from": "2016/02/01",
  16. "to" : "now/d"
  17. }
  18. ]
  19. }
  20. }
  21. }
  22. }
date フィールドに値がないドキュメントは「古い」
バケットに追加されます。

日付形式/パターン

この情報は DateTimeFormatter からコピーされました。

すべてのASCII文字は形式パターン文字として予約されており、次のように定義されています:

シンボル 意味 表示
G 時代 テキスト AD; Anno Domini; A
u 2004; 04
y 時代の年 2004; 04
D 年の日 数字 189
M/L 年の月 数字/テキスト 7; 07; Jul; July; J
d 月の日 数字 10
Q/q 年の四半期 数字/テキスト 3; 03; Q3; 3rd quarter
Y 週ベースの年 1996; 96
w 週ベースの年の週 数字 27
W 月の週 数字 4
E 週の日 テキスト 火; 火曜日; T
e/c ローカライズされた週の日 数字/テキスト 2; 02; 火; 火曜日; T
F 月の週 数字 3
a 日の午前午後 テキスト PM
h 午前午後の時計の時間 (1-12) 数字 12
K 午前午後の時間 (0-11) 数字 0
k 午前午後の時計の時間 (1-24) 数字 0
H 日の時間 (0-23) 数字 0
m 時間の分 数字 30
s 分の秒 数字 55
S 秒の分数 分数 978
A 日のミリ秒 数字 1234
n 秒のナノ 数字 987654321
N 日のナノ 数字 1234000000
V タイムゾーンID ゾーンID America/Los_Angeles; Z; -08:30
z タイムゾーン名 ゾーン名 太平洋標準時; PST
O ローカライズされたゾーンオフセット オフセット-O GMT+8; GMT+08:00; UTC-08:00;
X ゼロのためのゾーンオフセット Z オフセット-X Z; -08; -0830; -08:30; -083015; -08:30:15;
x ゾーンオフセット オフセット-x +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z ゾーンオフセット オフセット-Z +0000; -0800; -08:00;
p 次のパッド パッド修飾子 1
テキストのエスケープ デリミタ ‘’
シングルクォート リテラル [
オプションセクションの開始 ] オプションセクションの終了 #
将来の使用のために予約 { 将来の使用のために予約 }

パターン文字の数が形式を決定します。

  • テキスト
  • テキストスタイルは、使用されるパターン文字の数に基づいて決定されます。4文字未満のパターン文字は短い形式を使用します。正確に4文字のパターン文字は完全な形式を使用します。正確に5文字のパターン文字は狭い形式を使用します。パターン文字 L, c, および q は、テキストスタイルの独立した形式を指定します。
  • 数字
  • 文字の数が1の場合、値は最小の桁数で出力され、パディングはありません。それ以外の場合、桁数は出力フィールドの幅として使用され、必要に応じて値はゼロパディングされます。次のパターン文字には、文字数に制約があります。c および F の文字は1文字のみ指定できます。d, H, h, K, k, m, および s の文字は最大2文字指定できます。D の文字は最大3文字指定できます。
  • 数字/テキスト
  • パターン文字の数が3以上の場合は、上記のテキストルールを使用します。それ以外の場合は、上記の数字ルールを使用します。
  • 分数
  • ナノ秒フィールドを秒の分数として出力します。ナノ秒値は9桁であり、したがってパターン文字の数は1から9です。9未満の場合、ナノ秒値は切り捨てられ、最も重要な桁のみが出力されます。
  • 文字の数は、パディングが使用される最小フィールド幅を決定します。文字の数が2の場合、2桁の形式が使用されます。印刷時、これは右端の2桁を出力します。解析時、これは2000の基準値を使用して解析され、2000年から2099年の範囲内の年が得られます。文字の数が4未満(ただし2ではない)場合、SignStyle.NORMAL に従って負の年に対してのみ符号が出力されます。それ以外の場合、SignStyle.EXCEEDS_PAD に従ってパッド幅が超えた場合に符号が出力されます。
  • ZoneId
  • これは、Europe/Paris のようなタイムゾーンIDを出力します。文字の数が2の場合、タイムゾーンIDが出力されます。他の文字数は IllegalArgumentException をスローします。
  • ゾーン名
  • これは、タイムゾーンIDの表示名を出力します。文字の数が1、2、または3の場合、短い名前が出力されます。文字の数が4の場合、完全な名前が出力されます。5文字以上は IllegalArgumentException をスローします。
  • オフセット X および x
  • これは、パターン文字の数に基づいてオフセットをフォーマットします。1文字は、+01 のように時間のみを出力しますが、分がゼロでない場合は分も出力されます(+0130 のように)。2文字は、コロンなしで時間と分を出力します(+0130 のように)。3文字は、コロン付きで時間と分を出力します(+01:30 のように)。4文字は、コロンなしで時間と分とオプションの秒を出力します(+013015 のように)。5文字は、コロン付きで時間と分とオプションの秒を出力します(+01:30:15 のように)。6文字以上は IllegalArgumentException をスローします。パターン文字 X (大文字) は、出力されるオフセットがゼロである場合に Z を出力し、パターン文字 x (小文字) は +00, +0000, または +00:00 を出力します。
  • オフセット O
  • これは、パターン文字の数に基づいてローカライズされたオフセットをフォーマットします。1文字は、GMT のようにローカライズされたオフセットの短い形式を出力します。これは、先頭ゼロなしの時間、ゼロでない場合はオプションの2桁の分と秒、コロンを含みます(GMT+8 のように)。4文字は、GMT, with 2-digit hour and minute field, optional second field if non-zero, and colon, for example `GMT+08:00 のようにローカライズされたオフセットの完全な形式を出力します。他の文字数は IllegalArgumentException をスローします。
  • オフセット Z
  • これは、パターン文字の数に基づいてオフセットをフォーマットします。1、2、または3文字は、コロンなしで時間と分を出力します(+0130 のように)。オフセットがゼロの場合、出力は +0000 になります。4文字は、オフセット-O の4文字に相当するローカライズされたオフセットの完全な形式を出力します。オフセットがゼロの場合、出力は対応するローカライズされたオフセットテキストになります。5文字は、ゼロでない場合はオプションの秒を含む時間、分をコロン付きで出力します。オフセットがゼロの場合、Z を出力します。6文字以上は IllegalArgumentException をスローします。
  • オプションセクション
  • オプションセクションマーカーは、DateTimeFormatterBuilder.optionalStart() および DateTimeFormatterBuilder.optionalEnd() を呼び出すのとまったく同じように機能します。
  • パッド修飾子
  • 直後のパターンをスペースでパディングされるように修正します。パッド幅はパターン文字の数によって決まります。これは、DateTimeFormatterBuilder.padNext(int) を呼び出すのと同じです。

例えば、ppH は、幅2にパディングされた日の時間を出力します。

認識されない文字はエラーです。[, ], {, }, # およびシングルクォート以外の非文字文字は直接出力されます。それにもかかわらず、将来の変更がアプリケーションを壊さないように、直接出力したいすべての文字の周りにシングルクォートを使用することをお勧めします。

日付範囲集計におけるタイムゾーン

日付は、time_zone パラメータを指定することによって、別のタイムゾーンからUTCに変換できます。

タイムゾーンは、ISO 8601 UTCオフセット(例: +01:00 または -08:00)として指定するか、TZデータベースのタイムゾーンIDのいずれかとして指定できます。

time_zone パラメータは、日付数学表現の丸めにも適用されます。たとえば、CETタイムゾーンで日の始まりに丸めるには、次のようにします:

Python

  1. resp = client.search(
  2. index="sales",
  3. size="0",
  4. aggs={
  5. "range": {
  6. "date_range": {
  7. "field": "date",
  8. "time_zone": "CET",
  9. "ranges": [
  10. {
  11. "to": "2016/02/01"
  12. },
  13. {
  14. "from": "2016/02/01",
  15. "to": "now/d"
  16. },
  17. {
  18. "from": "now/d"
  19. }
  20. ]
  21. }
  22. }
  23. },
  24. )
  25. print(resp)

Ruby

  1. response = client.search(
  2. index: 'sales',
  3. size: 0,
  4. body: {
  5. aggregations: {
  6. range: {
  7. date_range: {
  8. field: 'date',
  9. time_zone: 'CET',
  10. ranges: [
  11. {
  12. to: '2016/02/01'
  13. },
  14. {
  15. from: '2016/02/01',
  16. to: 'now/d'
  17. },
  18. {
  19. from: 'now/d'
  20. }
  21. ]
  22. }
  23. }
  24. }
  25. }
  26. )
  27. puts response

Js

  1. const response = await client.search({
  2. index: "sales",
  3. size: 0,
  4. aggs: {
  5. range: {
  6. date_range: {
  7. field: "date",
  8. time_zone: "CET",
  9. ranges: [
  10. {
  11. to: "2016/02/01",
  12. },
  13. {
  14. from: "2016/02/01",
  15. to: "now/d",
  16. },
  17. {
  18. from: "now/d",
  19. },
  20. ],
  21. },
  22. },
  23. },
  24. });
  25. console.log(response);

コンソール

  1. POST /sales/_search?size=0
  2. {
  3. "aggs": {
  4. "range": {
  5. "date_range": {
  6. "field": "date",
  7. "time_zone": "CET",
  8. "ranges": [
  9. { "to": "2016/02/01" },
  10. { "from": "2016/02/01", "to" : "now/d" },
  11. { "from": "now/d" }
  12. ]
  13. }
  14. }
  15. }
  16. }
この日付は 2016-02-01T00:00:00.000+01:00 に変換されます。
now/d はCETタイムゾーンの始まりに丸められます。

キー付き応答

keyed フラグを true に設定すると、各バケットに一意の文字列キーが関連付けられ、範囲が配列ではなくハッシュとして返されます:

Python

  1. resp = client.search(
  2. index="sales",
  3. size="0",
  4. aggs={
  5. "range": {
  6. "date_range": {
  7. "field": "date",
  8. "format": "MM-yyy",
  9. "ranges": [
  10. {
  11. "to": "now-10M/M"
  12. },
  13. {
  14. "from": "now-10M/M"
  15. }
  16. ],
  17. "keyed": True
  18. }
  19. }
  20. },
  21. )
  22. print(resp)

Ruby

  1. response = client.search(
  2. index: 'sales',
  3. size: 0,
  4. body: {
  5. aggregations: {
  6. range: {
  7. date_range: {
  8. field: 'date',
  9. format: 'MM-yyy',
  10. ranges: [
  11. {
  12. to: 'now-10M/M'
  13. },
  14. {
  15. from: 'now-10M/M'
  16. }
  17. ],
  18. keyed: true
  19. }
  20. }
  21. }
  22. }
  23. )
  24. puts response

Js

  1. const response = await client.search({
  2. index: "sales",
  3. size: 0,
  4. aggs: {
  5. range: {
  6. date_range: {
  7. field: "date",
  8. format: "MM-yyy",
  9. ranges: [
  10. {
  11. to: "now-10M/M",
  12. },
  13. {
  14. from: "now-10M/M",
  15. },
  16. ],
  17. keyed: true,
  18. },
  19. },
  20. },
  21. });
  22. console.log(response);

コンソール

  1. POST /sales/_search?size=0
  2. {
  3. "aggs": {
  4. "range": {
  5. "date_range": {
  6. "field": "date",
  7. "format": "MM-yyy",
  8. "ranges": [
  9. { "to": "now-10M/M" },
  10. { "from": "now-10M/M" }
  11. ],
  12. "keyed": true
  13. }
  14. }
  15. }
  16. }

応答:

コンソール-結果

  1. {
  2. ...
  3. "aggregations": {
  4. "range": {
  5. "buckets": {
  6. "*-10-2015": {
  7. "to": 1.4436576E12,
  8. "to_as_string": "10-2015",
  9. "doc_count": 7
  10. },
  11. "10-2015-*": {
  12. "from": 1.4436576E12,
  13. "from_as_string": "10-2015",
  14. "doc_count": 0
  15. }
  16. }
  17. }
  18. }
  19. }

各範囲のキーをカスタマイズすることも可能です:

Python

  1. resp = client.search(
  2. index="sales",
  3. size="0",
  4. aggs={
  5. "range": {
  6. "date_range": {
  7. "field": "date",
  8. "format": "MM-yyy",
  9. "ranges": [
  10. {
  11. "from": "01-2015",
  12. "to": "03-2015",
  13. "key": "quarter_01"
  14. },
  15. {
  16. "from": "03-2015",
  17. "to": "06-2015",
  18. "key": "quarter_02"
  19. }
  20. ],
  21. "keyed": True
  22. }
  23. }
  24. },
  25. )
  26. print(resp)

Ruby

  1. response = client.search(
  2. index: 'sales',
  3. size: 0,
  4. body: {
  5. aggregations: {
  6. range: {
  7. date_range: {
  8. field: 'date',
  9. format: 'MM-yyy',
  10. ranges: [
  11. {
  12. from: '01-2015',
  13. to: '03-2015',
  14. key: 'quarter_01'
  15. },
  16. {
  17. from: '03-2015',
  18. to: '06-2015',
  19. key: 'quarter_02'
  20. }
  21. ],
  22. keyed: true
  23. }
  24. }
  25. }
  26. }
  27. )
  28. puts response

Js

  1. const response = await client.search({
  2. index: "sales",
  3. size: 0,
  4. aggs: {
  5. range: {
  6. date_range: {
  7. field: "date",
  8. format: "MM-yyy",
  9. ranges: [
  10. {
  11. from: "01-2015",
  12. to: "03-2015",
  13. key: "quarter_01",
  14. },
  15. {
  16. from: "03-2015",
  17. to: "06-2015",
  18. key: "quarter_02",
  19. },
  20. ],
  21. keyed: true,
  22. },
  23. },
  24. },
  25. });
  26. console.log(response);

コンソール

  1. POST /sales/_search?size=0
  2. {
  3. "aggs": {
  4. "range": {
  5. "date_range": {
  6. "field": "date",
  7. "format": "MM-yyy",
  8. "ranges": [
  9. { "from": "01-2015", "to": "03-2015", "key": "quarter_01" },
  10. { "from": "03-2015", "to": "06-2015", "key": "quarter_02" }
  11. ],
  12. "keyed": true
  13. }
  14. }
  15. }
  16. }

応答:

コンソール-結果

  1. {
  2. ...
  3. "aggregations": {
  4. "range": {
  5. "buckets": {
  6. "quarter_01": {
  7. "from": 1.4200704E12,
  8. "from_as_string": "01-2015",
  9. "to": 1.425168E12,
  10. "to_as_string": "03-2015",
  11. "doc_count": 5
  12. },
  13. "quarter_02": {
  14. "from": 1.425168E12,
  15. "from_as_string": "03-2015",
  16. "to": 1.4331168E12,
  17. "to_as_string": "06-2015",
  18. "doc_count": 2
  19. }
  20. }
  21. }
  22. }
  23. }