ジオポイントフィールドタイプ

タイプ geo_point のフィールドは、緯度-経度ペアを受け入れ、次のように使用できます:

  • バウンディングボックス 内のジオポイントを見つけるため、中央点からの特定の距離内、または geo_shape クエリ 内(例えば、ポリゴン内のポイント)。
  • 中央点からの距離によってドキュメントを集約するため。
  • 地理グリッドによってドキュメントを集約するため: geo_hashgeo_tile または geo_hex
  • メトリクス集約 geo_line を使用してジオポイントをトラックに集約するため。
  • ドキュメントの関連スコアに距離を統合するため。
  • 距離によってドキュメントをソートするため。

geo_shapepoint と同様に、geo_pointGeoJSON および Well-Known Text フォーマットで指定できます。ただし、便利さと歴史的理由からサポートされている追加のフォーマットがいくつかあります。ジオポイントを指定する方法は合計で6つあり、以下に示します:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "properties": {
  5. "location": {
  6. "type": "geo_point"
  7. }
  8. }
  9. },
  10. )
  11. print(resp)
  12. resp1 = client.index(
  13. index="my-index-000001",
  14. id="1",
  15. document={
  16. "text": "Geopoint as an object using GeoJSON format",
  17. "location": {
  18. "type": "Point",
  19. "coordinates": [
  20. -71.34,
  21. 41.12
  22. ]
  23. }
  24. },
  25. )
  26. print(resp1)
  27. resp2 = client.index(
  28. index="my-index-000001",
  29. id="2",
  30. document={
  31. "text": "Geopoint as a WKT POINT primitive",
  32. "location": "POINT (-71.34 41.12)"
  33. },
  34. )
  35. print(resp2)
  36. resp3 = client.index(
  37. index="my-index-000001",
  38. id="3",
  39. document={
  40. "text": "Geopoint as an object with 'lat' and 'lon' keys",
  41. "location": {
  42. "lat": 41.12,
  43. "lon": -71.34
  44. }
  45. },
  46. )
  47. print(resp3)
  48. resp4 = client.index(
  49. index="my-index-000001",
  50. id="4",
  51. document={
  52. "text": "Geopoint as an array",
  53. "location": [
  54. -71.34,
  55. 41.12
  56. ]
  57. },
  58. )
  59. print(resp4)
  60. resp5 = client.index(
  61. index="my-index-000001",
  62. id="5",
  63. document={
  64. "text": "Geopoint as a string",
  65. "location": "41.12,-71.34"
  66. },
  67. )
  68. print(resp5)
  69. resp6 = client.index(
  70. index="my-index-000001",
  71. id="6",
  72. document={
  73. "text": "Geopoint as a geohash",
  74. "location": "drm3btev3e86"
  75. },
  76. )
  77. print(resp6)
  78. resp7 = client.search(
  79. index="my-index-000001",
  80. query={
  81. "geo_bounding_box": {
  82. "location": {
  83. "top_left": {
  84. "lat": 42,
  85. "lon": -72
  86. },
  87. "bottom_right": {
  88. "lat": 40,
  89. "lon": -74
  90. }
  91. }
  92. }
  93. },
  94. )
  95. print(resp7)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. properties: {
  6. location: {
  7. type: 'geo_point'
  8. }
  9. }
  10. }
  11. }
  12. )
  13. puts response
  14. response = client.index(
  15. index: 'my-index-000001',
  16. id: 1,
  17. body: {
  18. text: 'Geopoint as an object using GeoJSON format',
  19. location: {
  20. type: 'Point',
  21. coordinates: [
  22. -71.34,
  23. 41.12
  24. ]
  25. }
  26. }
  27. )
  28. puts response
  29. response = client.index(
  30. index: 'my-index-000001',
  31. id: 2,
  32. body: {
  33. text: 'Geopoint as a WKT POINT primitive',
  34. location: 'POINT (-71.34 41.12)'
  35. }
  36. )
  37. puts response
  38. response = client.index(
  39. index: 'my-index-000001',
  40. id: 3,
  41. body: {
  42. text: "Geopoint as an object with 'lat' and 'lon' keys",
  43. location: {
  44. lat: 41.12,
  45. lon: -71.34
  46. }
  47. }
  48. )
  49. puts response
  50. response = client.index(
  51. index: 'my-index-000001',
  52. id: 4,
  53. body: {
  54. text: 'Geopoint as an array',
  55. location: [
  56. -71.34,
  57. 41.12
  58. ]
  59. }
  60. )
  61. puts response
  62. response = client.index(
  63. index: 'my-index-000001',
  64. id: 5,
  65. body: {
  66. text: 'Geopoint as a string',
  67. location: '41.12,-71.34'
  68. }
  69. )
  70. puts response
  71. response = client.index(
  72. index: 'my-index-000001',
  73. id: 6,
  74. body: {
  75. text: 'Geopoint as a geohash',
  76. location: 'drm3btev3e86'
  77. }
  78. )
  79. puts response
  80. response = client.search(
  81. index: 'my-index-000001',
  82. body: {
  83. query: {
  84. geo_bounding_box: {
  85. location: {
  86. top_left: {
  87. lat: 42,
  88. lon: -72
  89. },
  90. bottom_right: {
  91. lat: 40,
  92. lon: -74
  93. }
  94. }
  95. }
  96. }
  97. }
  98. )
  99. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. properties: {
  5. location: {
  6. type: "geo_point",
  7. },
  8. },
  9. },
  10. });
  11. console.log(response);
  12. const response1 = await client.index({
  13. index: "my-index-000001",
  14. id: 1,
  15. document: {
  16. text: "Geopoint as an object using GeoJSON format",
  17. location: {
  18. type: "Point",
  19. coordinates: [-71.34, 41.12],
  20. },
  21. },
  22. });
  23. console.log(response1);
  24. const response2 = await client.index({
  25. index: "my-index-000001",
  26. id: 2,
  27. document: {
  28. text: "Geopoint as a WKT POINT primitive",
  29. location: "POINT (-71.34 41.12)",
  30. },
  31. });
  32. console.log(response2);
  33. const response3 = await client.index({
  34. index: "my-index-000001",
  35. id: 3,
  36. document: {
  37. text: "Geopoint as an object with 'lat' and 'lon' keys",
  38. location: {
  39. lat: 41.12,
  40. lon: -71.34,
  41. },
  42. },
  43. });
  44. console.log(response3);
  45. const response4 = await client.index({
  46. index: "my-index-000001",
  47. id: 4,
  48. document: {
  49. text: "Geopoint as an array",
  50. location: [-71.34, 41.12],
  51. },
  52. });
  53. console.log(response4);
  54. const response5 = await client.index({
  55. index: "my-index-000001",
  56. id: 5,
  57. document: {
  58. text: "Geopoint as a string",
  59. location: "41.12,-71.34",
  60. },
  61. });
  62. console.log(response5);
  63. const response6 = await client.index({
  64. index: "my-index-000001",
  65. id: 6,
  66. document: {
  67. text: "Geopoint as a geohash",
  68. location: "drm3btev3e86",
  69. },
  70. });
  71. console.log(response6);
  72. const response7 = await client.search({
  73. index: "my-index-000001",
  74. query: {
  75. geo_bounding_box: {
  76. location: {
  77. top_left: {
  78. lat: 42,
  79. lon: -72,
  80. },
  81. bottom_right: {
  82. lat: 40,
  83. lon: -74,
  84. },
  85. },
  86. },
  87. },
  88. });
  89. console.log(response7);

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "properties": {
  5. "location": {
  6. "type": "geo_point"
  7. }
  8. }
  9. }
  10. }
  11. PUT my-index-000001/_doc/1
  12. {
  13. "text": "Geopoint as an object using GeoJSON format",
  14. "location": {
  15. "type": "Point",
  16. "coordinates": [-71.34, 41.12]
  17. }
  18. }
  19. PUT my-index-000001/_doc/2
  20. {
  21. "text": "Geopoint as a WKT POINT primitive",
  22. "location" : "POINT (-71.34 41.12)"
  23. }
  24. PUT my-index-000001/_doc/3
  25. {
  26. "text": "Geopoint as an object with 'lat' and 'lon' keys",
  27. "location": {
  28. "lat": 41.12,
  29. "lon": -71.34
  30. }
  31. }
  32. PUT my-index-000001/_doc/4
  33. {
  34. "text": "Geopoint as an array",
  35. "location": [ -71.34, 41.12 ]
  36. }
  37. PUT my-index-000001/_doc/5
  38. {
  39. "text": "Geopoint as a string",
  40. "location": "41.12,-71.34"
  41. }
  42. PUT my-index-000001/_doc/6
  43. {
  44. "text": "Geopoint as a geohash",
  45. "location": "drm3btev3e86"
  46. }
  47. GET my-index-000001/_search
  48. {
  49. "query": {
  50. "geo_bounding_box": {
  51. "location": {
  52. "top_left": {
  53. "lat": 42,
  54. "lon": -72
  55. },
  56. "bottom_right": {
  57. "lat": 40,
  58. "lon": -74
  59. }
  60. }
  61. }
  62. }
  63. }
GeoJSON フォーマットで type および coordinates キーを持つオブジェクトとして表現されたジオポイント。
フォーマット:"POINT(lon lat)"Well-Known Text 形式のジオポイント。
lat および lon キーを持つオブジェクトとして表現されたジオポイント。
フォーマット:[ lon, lat] の配列として表現されたジオポイント。
フォーマット:"lat,lon" の文字列として表現されたジオポイント。
ジオハッシュとして表現されたジオポイント。
ボックス内にあるすべてのジオポイントを見つけるジオバウンディングボックスクエリ。

配列または文字列として表現されたジオポイント

文字列ジオポイントは lat,lon の順序で並べられますが、配列ジオポイント、GeoJSON および WKT は逆の順序で並べられます: lon,lat

その理由は歴史的なものです。地理学者は伝統的に latitudelongitude の前に書きますが、GeoJSONWell-Known Text のような最近の地理データ用に指定されたフォーマットは、longitudelatitude の前に(東経が北緯の前)並べて、xy の前に並べる数学的慣習に合わせています。

ポイントは ジオハッシュ として表現できます。ジオハッシュは、緯度と経度のビットを交互にエンコードした base32 形式の文字列です。ジオハッシュの各文字は精度に追加の5ビットを加えます。したがって、ハッシュが長いほど、より正確になります。インデックス作成の目的で、ジオハッシュは緯度-経度ペアに変換されます。このプロセス中、最初の12文字のみが使用されるため、ジオハッシュで12文字以上を指定しても精度は向上しません。12文字は60ビットを提供し、可能な誤差を2cm未満に減少させるはずです。

geo_point フィールドのパラメータ

次のパラメータは geo_point フィールドで受け入れられます:

ignore_malformed true の場合、誤ったジオポイントは無視されます。false(デフォルト)の場合、
誤ったジオポイントは例外をスローし、ドキュメント全体が拒否されます。
ジオポイントは、緯度が範囲 -90 ⇐ 緯度 ⇐ 90 の外にある場合、または経度が範囲 -180 ⇐ 経度 ⇐ 180 の外にある場合、誤っていると見なされます。
この設定は script パラメータが使用されている場合には設定できません。
ignore_z_value true(デフォルト)の場合、三次元ポイントが受け入れられ(ソースに保存されます)
緯度と経度の値のみがインデックスされ、第三の次元は無視されます。false の場合、緯度と経度(2次元)以外の値を含むジオポイントは例外をスローし、ドキュメント全体が拒否されます。この設定は script パラメータが使用されている場合には設定できません。
index フィールドは迅速に検索可能であるべきですか?true(デフォルト)および false を受け入れます。 doc_values のみが有効なフィールドは、クエリ可能ですが、遅くなります。
null_value 明示的な null 値の代わりに置き換えられるジオポイント値を受け入れます。
デフォルトは null で、これはフィールドが欠落していると見なされることを意味します。この設定は script パラメータが使用されている場合には設定できません。
on_script_error script パラメータによって定義されたスクリプトがインデックス作成時にエラーをスローした場合に何をするかを定義します。fail(デフォルト)を受け入れ、これによりドキュメント全体が拒否され、continue を受け入れ、これによりフィールドがドキュメントの
_ignored メタデータフィールドに登録され、インデックス作成が続行されます。このパラメータは script フィールドが設定されている場合にのみ設定できます。

| script | このパラメータが設定されている場合、フィールドはこのスクリプトによって生成された値をインデックスし、ソースから直接値を読み取るのではなくなります。入力ドキュメントでこのフィールドに値が設定されている場合、ドキュメントはエラーで拒否されます。
スクリプトはそのruntime equivalent と同じ形式であり、(lat, lon) のダブル値のペアとしてポイントを出力する必要があります。

スクリプトでのジオポイントの使用

スクリプト内でジオポイントの値にアクセスする際、値は GeoPoint オブジェクトとして返され、.lat および .lon の値にそれぞれアクセスできます:

ペインレス

  1. def geopoint = doc['location'].value;
  2. def lat = geopoint.lat;
  3. def lon = geopoint.lon;

パフォーマンスの理由から、lat/lon 値に直接アクセスする方が良いです:

ペインレス

  1. def lat = doc['location'].lat;
  2. def lon = doc['location'].lon;

合成ソース

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

geo_point フィールドは、デフォルト構成で 合成 _source をサポートします。合成 _source は、copy_to または doc_values が無効な場合には使用できません。

合成ソースは常に geo_point フィールドをソートし(最初に緯度、次に経度)、保存された精度に減少させます。例えば:

Python

  1. resp = client.indices.create(
  2. index="idx",
  3. mappings={
  4. "_source": {
  5. "mode": "synthetic"
  6. },
  7. "properties": {
  8. "point": {
  9. "type": "geo_point"
  10. }
  11. }
  12. },
  13. )
  14. print(resp)
  15. resp1 = client.index(
  16. index="idx",
  17. id="1",
  18. document={
  19. "point": [
  20. {
  21. "lat": -90,
  22. "lon": -80
  23. },
  24. {
  25. "lat": 10,
  26. "lon": 30
  27. }
  28. ]
  29. },
  30. )
  31. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'idx',
  3. body: {
  4. mappings: {
  5. _source: {
  6. mode: 'synthetic'
  7. },
  8. properties: {
  9. point: {
  10. type: 'geo_point'
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response
  17. response = client.index(
  18. index: 'idx',
  19. id: 1,
  20. body: {
  21. point: [
  22. {
  23. lat: -90,
  24. lon: -80
  25. },
  26. {
  27. lat: 10,
  28. lon: 30
  29. }
  30. ]
  31. }
  32. )
  33. puts response

Js

  1. const response = await client.indices.create({
  2. index: "idx",
  3. mappings: {
  4. _source: {
  5. mode: "synthetic",
  6. },
  7. properties: {
  8. point: {
  9. type: "geo_point",
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);
  15. const response1 = await client.index({
  16. index: "idx",
  17. id: 1,
  18. document: {
  19. point: [
  20. {
  21. lat: -90,
  22. lon: -80,
  23. },
  24. {
  25. lat: 10,
  26. lon: 30,
  27. },
  28. ],
  29. },
  30. });
  31. console.log(response1);

コンソール

  1. PUT idx
  2. {
  3. "mappings": {
  4. "_source": { "mode": "synthetic" },
  5. "properties": {
  6. "point": { "type": "geo_point" }
  7. }
  8. }
  9. }
  10. PUT idx/_doc/1
  11. {
  12. "point": [
  13. {"lat":-90, "lon":-80},
  14. {"lat":10, "lon":30}
  15. ]
  16. }

次のようになります:

コンソール-結果

  1. {
  2. "point": [
  3. {"lat":-90.0, "lon":-80.00000000931323},
  4. {"lat":9.999999990686774, "lon":29.999999972060323}
  5. ]
  6. }