自動間隔日付ヒストグラム集約

各バケットの幅として使用する間隔を提供する代わりに、必要なバケットの数を示すターゲット数が提供され、そのターゲットを最もよく達成するためにバケットの間隔が自動的に選択される、日付ヒストグラムに似たマルチバケット集約です。返されるバケットの数は常にこのターゲット数以下になります。

バケットフィールドはオプションであり、指定されていない場合はデフォルトで10バケットになります。

ターゲットとして10バケットを要求します。

Python

  1. resp = client.search(
  2. index="sales",
  3. size="0",
  4. aggs={
  5. "sales_over_time": {
  6. "auto_date_histogram": {
  7. "field": "date",
  8. "buckets": 10
  9. }
  10. }
  11. },
  12. )
  13. print(resp)

Ruby

  1. response = client.search(
  2. index: 'sales',
  3. size: 0,
  4. body: {
  5. aggregations: {
  6. sales_over_time: {
  7. auto_date_histogram: {
  8. field: 'date',
  9. buckets: 10
  10. }
  11. }
  12. }
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.search({
  2. index: "sales",
  3. size: 0,
  4. aggs: {
  5. sales_over_time: {
  6. auto_date_histogram: {
  7. field: "date",
  8. buckets: 10,
  9. },
  10. },
  11. },
  12. });
  13. console.log(response);

コンソール

  1. POST /sales/_search?size=0
  2. {
  3. "aggs": {
  4. "sales_over_time": {
  5. "auto_date_histogram": {
  6. "field": "date",
  7. "buckets": 10
  8. }
  9. }
  10. }
  11. }

キー

内部的に、日付はエポックからのミリ秒で表される64ビットの数として表現されます。これらのタイムスタンプはバケットkeyとして返されます。key_as_stringは、formatパラメータで指定された形式を使用してフォーマットされた日付文字列に変換された同じタイムスタンプです:

  1. #### Python
  2. ``````python
  3. resp = client.search(
  4. index="sales",
  5. size="0",
  6. aggs={
  7. "sales_over_time": {
  8. "auto_date_histogram": {
  9. "field": "date",
  10. "buckets": 5,
  11. "format": "yyyy-MM-dd"
  12. }
  13. }
  14. },
  15. )
  16. print(resp)
  17. `

Ruby

  1. response = client.search(
  2. index: 'sales',
  3. size: 0,
  4. body: {
  5. aggregations: {
  6. sales_over_time: {
  7. auto_date_histogram: {
  8. field: 'date',
  9. buckets: 5,
  10. format: 'yyyy-MM-dd'
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response

Js

  1. const response = await client.search({
  2. index: "sales",
  3. size: 0,
  4. aggs: {
  5. sales_over_time: {
  6. auto_date_histogram: {
  7. field: "date",
  8. buckets: 5,
  9. format: "yyyy-MM-dd",
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);

コンソール

  1. POST /sales/_search?size=0
  2. {
  3. "aggs": {
  4. "sales_over_time": {
  5. "auto_date_histogram": {
  6. "field": "date",
  7. "buckets": 5,
  8. "format": "yyyy-MM-dd"
  9. }
  10. }
  11. }
  12. }
表現力豊かな日付形式パターンをサポートします。

応答:

コンソール-結果

  1. {
  2. ...
  3. "aggregations": {
  4. "sales_over_time": {
  5. "buckets": [
  6. {
  7. "key_as_string": "2015-01-01",
  8. "key": 1420070400000,
  9. "doc_count": 3
  10. },
  11. {
  12. "key_as_string": "2015-02-01",
  13. "key": 1422748800000,
  14. "doc_count": 2
  15. },
  16. {
  17. "key_as_string": "2015-03-01",
  18. "key": 1425168000000,
  19. "doc_count": 2
  20. }
  21. ],
  22. "interval": "1M"
  23. }
  24. }
  25. }

間隔

返されるバケットの間隔は、集約によって収集されたデータに基づいて選択され、返されるバケットの数は要求された数以下になります。返される可能な間隔は:

1、5、10、30の倍数で
1、5、10、30の倍数で
時間 1、3、12の倍数で
1、7の倍数で
1、3の倍数で
1、5、10、20、50、100の倍数で

最悪の場合、日次バケットの数が要求されたバケットの数に対して多すぎる場合、返されるバケットの数は要求されたバケットの数の1/7になります。

タイムゾーン

日付時刻はElasticsearchにUTCで保存されます。デフォルトでは、すべてのバケット化と丸めもUTCで行われます。time_zoneパラメータを使用して、バケット化に異なるタイムゾーンを使用することを示すことができます。

タイムゾーンは、ISO 8601 UTCオフセット(例:+01:00または-08:00)として指定するか、America/Los_AngelesのようなTZデータベースで使用される識別子として指定できます。

次の例を考えてみてください:

Python

  1. resp = client.index(
  2. index="my-index-000001",
  3. id="1",
  4. refresh=True,
  5. document={
  6. "date": "2015-10-01T00:30:00Z"
  7. },
  8. )
  9. print(resp)
  10. resp1 = client.index(
  11. index="my-index-000001",
  12. id="2",
  13. refresh=True,
  14. document={
  15. "date": "2015-10-01T01:30:00Z"
  16. },
  17. )
  18. print(resp1)
  19. resp2 = client.index(
  20. index="my-index-000001",
  21. id="3",
  22. refresh=True,
  23. document={
  24. "date": "2015-10-01T02:30:00Z"
  25. },
  26. )
  27. print(resp2)
  28. resp3 = client.search(
  29. index="my-index-000001",
  30. size="0",
  31. aggs={
  32. "by_day": {
  33. "auto_date_histogram": {
  34. "field": "date",
  35. "buckets": 3
  36. }
  37. }
  38. },
  39. )
  40. print(resp3)

Ruby

  1. response = client.index(
  2. index: 'my-index-000001',
  3. id: 1,
  4. refresh: true,
  5. body: {
  6. date: '2015-10-01T00:30:00Z'
  7. }
  8. )
  9. puts response
  10. response = client.index(
  11. index: 'my-index-000001',
  12. id: 2,
  13. refresh: true,
  14. body: {
  15. date: '2015-10-01T01:30:00Z'
  16. }
  17. )
  18. puts response
  19. response = client.index(
  20. index: 'my-index-000001',
  21. id: 3,
  22. refresh: true,
  23. body: {
  24. date: '2015-10-01T02:30:00Z'
  25. }
  26. )
  27. puts response
  28. response = client.search(
  29. index: 'my-index-000001',
  30. size: 0,
  31. body: {
  32. aggregations: {
  33. by_day: {
  34. auto_date_histogram: {
  35. field: 'date',
  36. buckets: 3
  37. }
  38. }
  39. }
  40. }
  41. )
  42. puts response

Js

  1. const response = await client.index({
  2. index: "my-index-000001",
  3. id: 1,
  4. refresh: "true",
  5. document: {
  6. date: "2015-10-01T00:30:00Z",
  7. },
  8. });
  9. console.log(response);
  10. const response1 = await client.index({
  11. index: "my-index-000001",
  12. id: 2,
  13. refresh: "true",
  14. document: {
  15. date: "2015-10-01T01:30:00Z",
  16. },
  17. });
  18. console.log(response1);
  19. const response2 = await client.index({
  20. index: "my-index-000001",
  21. id: 3,
  22. refresh: "true",
  23. document: {
  24. date: "2015-10-01T02:30:00Z",
  25. },
  26. });
  27. console.log(response2);
  28. const response3 = await client.search({
  29. index: "my-index-000001",
  30. size: 0,
  31. aggs: {
  32. by_day: {
  33. auto_date_histogram: {
  34. field: "date",
  35. buckets: 3,
  36. },
  37. },
  38. },
  39. });
  40. console.log(response3);

コンソール

  1. PUT my-index-000001/_doc/1?refresh
  2. {
  3. "date": "2015-10-01T00:30:00Z"
  4. }
  5. PUT my-index-000001/_doc/2?refresh
  6. {
  7. "date": "2015-10-01T01:30:00Z"
  8. }
  9. PUT my-index-000001/_doc/3?refresh
  10. {
  11. "date": "2015-10-01T02:30:00Z"
  12. }
  13. GET my-index-000001/_search?size=0
  14. {
  15. "aggs": {
  16. "by_day": {
  17. "auto_date_histogram": {
  18. "field": "date",
  19. "buckets" : 3
  20. }
  21. }
  22. }
  23. }

UTCが指定されていない場合は使用され、2015年10月1日の真夜中UTCから始まる3つの1時間バケットが返されます:

コンソール-結果

  1. {
  2. ...
  3. "aggregations": {
  4. "by_day": {
  5. "buckets": [
  6. {
  7. "key_as_string": "2015-10-01T00:00:00.000Z",
  8. "key": 1443657600000,
  9. "doc_count": 1
  10. },
  11. {
  12. "key_as_string": "2015-10-01T01:00:00.000Z",
  13. "key": 1443661200000,
  14. "doc_count": 1
  15. },
  16. {
  17. "key_as_string": "2015-10-01T02:00:00.000Z",
  18. "key": 1443664800000,
  19. "doc_count": 1
  20. }
  21. ],
  22. "interval": "1h"
  23. }
  24. }
  25. }
  1. #### Python
  2. ``````python
  3. resp = client.search(
  4. index="my-index-000001",
  5. size="0",
  6. aggs={
  7. "by_day": {
  8. "auto_date_histogram": {
  9. "field": "date",
  10. "buckets": 3,
  11. "time_zone": "-01:00"
  12. }
  13. }
  14. },
  15. )
  16. print(resp)
  17. `

Ruby

  1. response = client.search(
  2. index: 'my-index-000001',
  3. size: 0,
  4. body: {
  5. aggregations: {
  6. by_day: {
  7. auto_date_histogram: {
  8. field: 'date',
  9. buckets: 3,
  10. time_zone: '-01:00'
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. size: 0,
  4. aggs: {
  5. by_day: {
  6. auto_date_histogram: {
  7. field: "date",
  8. buckets: 3,
  9. time_zone: "-01:00",
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);

コンソール

  1. GET my-index-000001/_search?size=0
  2. {
  3. "aggs": {
  4. "by_day": {
  5. "auto_date_histogram": {
  6. "field": "date",
  7. "buckets" : 3,
  8. "time_zone": "-01:00"
  9. }
  10. }
  11. }
  12. }

現在、3つの1時間バケットが返されますが、最初のバケットは2015年9月30日の午後11時から始まります。これは指定されたタイムゾーンのバケットのローカル時間です。

コンソール-結果

  1. {
  2. ...
  3. "aggregations": {
  4. "by_day": {
  5. "buckets": [
  6. {
  7. "key_as_string": "2015-09-30T23:00:00.000-01:00",
  8. "key": 1443657600000,
  9. "doc_count": 1
  10. },
  11. {
  12. "key_as_string": "2015-10-01T00:00:00.000-01:00",
  13. "key": 1443661200000,
  14. "doc_count": 1
  15. },
  16. {
  17. "key_as_string": "2015-10-01T01:00:00.000-01:00",
  18. "key": 1443664800000,
  19. "doc_count": 1
  20. }
  21. ],
  22. "interval": "1h"
  23. }
  24. }
  25. }
key_as_stringの値は、指定されたタイムゾーン内の各日の真夜中を表します。

DST(夏時間)変更に従うタイムゾーンを使用する場合、これらの変更が発生する瞬間に近いバケットは、隣接するバケットとはわずかに異なるサイズになる可能性があります。たとえば、CETタイムゾーンでのDST開始を考えてみてください:2016年3月27日午前2時に、時計は1時間進められ、午前3時のローカル時間になります。集約の結果が日次バケットであった場合、その日のバケットは通常の24時間ではなく、23時間のデータしか保持しません。他のバケットと同様に、12時間のような短い間隔でも同じことが言えます。ここでは、DSTシフトが発生する3月27日の朝に11時間のバケットしかありません。

最小間隔パラメータ

  1. `````minimum_interval`````の受け入れられる単位は:
  2. -
  3. -
  4. -
  5. - 時間
  6. -
  7. -
  8. #### Python
  9. ``````python
  10. resp = client.search(
  11. index="sales",
  12. size="0",
  13. aggs={
  14. "sale_date": {
  15. "auto_date_histogram": {
  16. "field": "date",
  17. "buckets": 10,
  18. "minimum_interval": "minute"
  19. }
  20. }
  21. },
  22. )
  23. print(resp)
  24. `

Ruby

  1. response = client.search(
  2. index: 'sales',
  3. size: 0,
  4. body: {
  5. aggregations: {
  6. sale_date: {
  7. auto_date_histogram: {
  8. field: 'date',
  9. buckets: 10,
  10. minimum_interval: 'minute'
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response

Js

  1. const response = await client.search({
  2. index: "sales",
  3. size: 0,
  4. aggs: {
  5. sale_date: {
  6. auto_date_histogram: {
  7. field: "date",
  8. buckets: 10,
  9. minimum_interval: "minute",
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);

コンソール

  1. POST /sales/_search?size=0
  2. {
  3. "aggs": {
  4. "sale_date": {
  5. "auto_date_histogram": {
  6. "field": "date",
  7. "buckets": 10,
  8. "minimum_interval": "minute"
  9. }
  10. }
  11. }
  12. }

欠損値

  1. #### Python
  2. ``````python
  3. resp = client.search(
  4. index="sales",
  5. size="0",
  6. aggs={
  7. "sale_date": {
  8. "auto_date_histogram": {
  9. "field": "date",
  10. "buckets": 10,
  11. "missing": "2000/01/01"
  12. }
  13. }
  14. },
  15. )
  16. print(resp)
  17. `

Ruby

  1. response = client.search(
  2. index: 'sales',
  3. size: 0,
  4. body: {
  5. aggregations: {
  6. sale_date: {
  7. auto_date_histogram: {
  8. field: 'date',
  9. buckets: 10,
  10. missing: '2000/01/01'
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response

Js

  1. const response = await client.search({
  2. index: "sales",
  3. size: 0,
  4. aggs: {
  5. sale_date: {
  6. auto_date_histogram: {
  7. field: "date",
  8. buckets: 10,
  9. missing: "2000/01/01",
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);

コンソール

  1. POST /sales/_search?size=0
  2. {
  3. "aggs": {
  4. "sale_date": {
  5. "auto_date_histogram": {
  6. "field": "date",
  7. "buckets": 10,
  8. "missing": "2000/01/01"
  9. }
  10. }
  11. }
  12. }
publish_dateフィールドに値がないドキュメントは、2000-01-01の値を持つドキュメントと同じバケットに入ります。