形状フィールドタイプ

shape データタイプは、長方形や多角形などの任意の x, y カルテシアン形状のインデックス作成と検索を容易にします。これは、座標が2次元平面座標系にあるジオメトリをインデックス作成およびクエリするために使用できます。

このタイプを使用してドキュメントをクエリするには、shape Queryを使用します。

マッピングオプション

geo_shape フィールドタイプと同様に、shape フィールドマッピングは、GeoJSON または Well-Known Text (WKT) ジオメトリオブジェクトを形状タイプにマッピングします。これを有効にするには、ユーザーはフィールドを形状タイプに明示的にマッピングする必要があります。

オプション 説明 デフォルト
orientation ポリゴン / マルチポリゴンの頂点順序を解釈する方法をオプションで定義します。このパラメータは、2つの座標系ルール(右手または左手)のいずれかを定義します。各ルールは3つの異なる方法で指定できます。1. 右手ルール: right, ccw, counterclockwise
  1. 左手ルール: left, cw, clockwise。デフォルトの向き(counterclockwise)は、OGC標準に準拠しており、外部リングの頂点は反時計回りの順序で、内部リング(穴)の頂点は時計回りの順序で定義されます。このパラメータを geo_shape マッピングで設定すると、geo_shape フィールドの座標リストの頂点順序が明示的に設定されますが、各個別のGeoJSONまたはWKTドキュメントで上書きできます。 | ccw |
    | ignore_malformed | trueの場合、無効なGeoJSONまたはWKT形状は無視されます。false(デフォルト)の場合、無効なGeoJSONおよびWKT形状は例外をスローし、ドキュメント全体を拒否します。 | false |
    | ignore_z_value | true(デフォルト)の場合、3次元ポイントが受け入れられ(ソースに保存されますが)、緯度と経度の値のみがインデックスされ、3次元目は無視されます。falseの場合、緯度と経度(2次元)以外の値を含むジオポイントは例外をスローし、ドキュメント全体を拒否します。 | true |
    | coerce | trueの場合、ポリゴン内の未閉じの線形リングが自動的に閉じられます。 | false |

インデックス作成アプローチ

geo_shapeのように、shape フィールドタイプは、ジオメトリを三角メッシュに分解し、各三角形をBKDツリー内の7次元ポイントとしてインデックス作成します。インデクサに提供される座標は単精度浮動小数点値であるため、フィールドはJava仮想マシンによって提供されるのと同じ精度(通常は1E-38)を保証します。ポリゴン/マルチポリゴンの場合、テッセレーターのパフォーマンスは、ジオメトリを定義する頂点の数に主に依存します。

重要な注意事項

CONTAINS 関係クエリ - shape クエリで relationcontains として定義されている場合、ElasticSearch 7.5.0以降で作成されたインデックスがサポートされています。

Python

  1. resp = client.indices.create(
  2. index="example",
  3. mappings={
  4. "properties": {
  5. "geometry": {
  6. "type": "shape"
  7. }
  8. }
  9. },
  10. )
  11. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'example',
  3. body: {
  4. mappings: {
  5. properties: {
  6. geometry: {
  7. type: 'shape'
  8. }
  9. }
  10. }
  11. }
  12. )
  13. puts response

Js

  1. const response = await client.indices.create({
  2. index: "example",
  3. mappings: {
  4. properties: {
  5. geometry: {
  6. type: "shape",
  7. },
  8. },
  9. },
  10. });
  11. console.log(response);

コンソール

  1. PUT /example
  2. {
  3. "mappings": {
  4. "properties": {
  5. "geometry": {
  6. "type": "shape"
  7. }
  8. }
  9. }
  10. }

このマッピング定義は、ジオメトリフィールドを形状タイプにマッピングします。インデクサは頂点値に単精度浮動小数点を使用するため、float 値がJava仮想マシンによって提供されるのと同じ精度(通常は1E-38)で保証されます。

入力構造

形状は、GeoJSON または Well-Known Text (WKT) フォーマットを使用して表現できます。以下の表は、GeoJSONおよびWKTをElasticsearchタイプにマッピングしたものです:

GeoJSONタイプ WKTタイプ Elasticsearchタイプ 説明
Point POINT point 単一の x, y 座標。
LineString LINESTRING linestring 2つ以上のポイントで与えられた任意のライン。
Polygon POLYGON polygon 最初と最後のポイントが一致する閉じたポリゴンで、したがって n + 1 頂点が必要で、n 辺のポリゴンを作成し、最小 4 頂点が必要です。
MultiPoint MULTIPOINT multipoint 接続されていないが、関連している可能性のあるポイントの配列。
MultiLineString MULTILINESTRING multilinestring 別々のラインストリングの配列。
MultiPolygon MULTIPOLYGON multipolygon 別々のポリゴンの配列。
GeometryCollection GEOMETRYCOLLECTION geometrycollection 複数のタイプが共存できる形状コレクション(例: ポイントとラインストリング)。
N/A BBOX envelope 上部左および下部右ポイントのみを指定することで指定された境界矩形またはエンベロープ。

すべてのタイプについて、内側の type および coordinates フィールドが必要です。

GeoJSONおよびWKT、したがってElasticsearchでは、正しい座標順序は(X, Y)です。これは、多くの地理空間API(例: geo_shape)とは異なり、通常は口語的な緯度、経度(Y, X)順序を使用します。

ポイント

ポイントは、カルテシアン x, y 空間内の単一の座標です。これは、仮想世界または投影空間内の関心のあるアイテムの位置を表すことがあります。以下は、GeoJSON内のポイントの例です。

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": {
  5. "type": "point",
  6. "coordinates": [
  7. -377.03653,
  8. 389.897676
  9. ]
  10. }
  11. },
  12. )
  13. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: {
  5. type: 'point',
  6. coordinates: [
  7. -377.03653,
  8. 389.897676
  9. ]
  10. }
  11. }
  12. )
  13. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: {
  5. type: "point",
  6. coordinates: [-377.03653, 389.897676],
  7. },
  8. },
  9. });
  10. console.log(response);

コンソール

  1. POST /example/_doc
  2. {
  3. "location" : {
  4. "type" : "point",
  5. "coordinates" : [-377.03653, 389.897676]
  6. }
  7. }

以下は、WKT内のポイントの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": "POINT (-377.03653 389.897676)"
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: 'POINT (-377.03653 389.897676)'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: "POINT (-377.03653 389.897676)",
  5. },
  6. });
  7. console.log(response);

コンソール

  1. POST /example/_doc
  2. {
  3. "location" : "POINT (-377.03653 389.897676)"
  4. }

ラインストリング

2つ以上の位置の配列によって定義される linestring。2つのポイントのみを指定することで、linestring は直線を表します。2つ以上のポイントを指定すると、任意のパスが作成されます。以下は、GeoJSON内のラインストリングの例です。

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": {
  5. "type": "linestring",
  6. "coordinates": [
  7. [
  8. -377.03653,
  9. 389.897676
  10. ],
  11. [
  12. -377.009051,
  13. 389.889939
  14. ]
  15. ]
  16. }
  17. },
  18. )
  19. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: {
  5. type: 'linestring',
  6. coordinates: [
  7. [
  8. -377.03653,
  9. 389.897676
  10. ],
  11. [
  12. -377.009051,
  13. 389.889939
  14. ]
  15. ]
  16. }
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: {
  5. type: "linestring",
  6. coordinates: [
  7. [-377.03653, 389.897676],
  8. [-377.009051, 389.889939],
  9. ],
  10. },
  11. },
  12. });
  13. console.log(response);

コンソール

  1. POST /example/_doc
  2. {
  3. "location" : {
  4. "type" : "linestring",
  5. "coordinates" : [[-377.03653, 389.897676], [-377.009051, 389.889939]]
  6. }
  7. }

以下は、WKT内のラインストリングの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": "LINESTRING (-377.03653 389.897676, -377.009051 389.889939)"
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: 'LINESTRING (-377.03653 389.897676, -377.009051 389.889939)'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: "LINESTRING (-377.03653 389.897676, -377.009051 389.889939)",
  5. },
  6. });
  7. console.log(response);

コンソール

  1. POST /example/_doc
  2. {
  3. "location" : "LINESTRING (-377.03653 389.897676, -377.009051 389.889939)"
  4. }

ポリゴン

ポリゴンは、ポイントのリストによって定義されます。各(外部)リストの最初と最後のポイントは同じでなければなりません(ポリゴンは閉じている必要があります)。以下は、GeoJSON内のポリゴンの例です。

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": {
  5. "type": "polygon",
  6. "coordinates": [
  7. [
  8. [
  9. 1000,
  10. -1001
  11. ],
  12. [
  13. 1001,
  14. -1001
  15. ],
  16. [
  17. 1001,
  18. -1000
  19. ],
  20. [
  21. 1000,
  22. -1000
  23. ],
  24. [
  25. 1000,
  26. -1001
  27. ]
  28. ]
  29. ]
  30. }
  31. },
  32. )
  33. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: {
  5. type: 'polygon',
  6. coordinates: [
  7. [
  8. [
  9. 1000,
  10. -1001
  11. ],
  12. [
  13. 1001,
  14. -1001
  15. ],
  16. [
  17. 1001,
  18. -1000
  19. ],
  20. [
  21. 1000,
  22. -1000
  23. ],
  24. [
  25. 1000,
  26. -1001
  27. ]
  28. ]
  29. ]
  30. }
  31. }
  32. )
  33. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: {
  5. type: "polygon",
  6. coordinates: [
  7. [
  8. [1000, -1001],
  9. [1001, -1001],
  10. [1001, -1000],
  11. [1000, -1000],
  12. [1000, -1001],
  13. ],
  14. ],
  15. },
  16. },
  17. });
  18. console.log(response);

コンソール

  1. POST /example/_doc
  2. {
  3. "location" : {
  4. "type" : "polygon",
  5. "coordinates" : [
  6. [ [1000.0, -1001.0], [1001.0, -1001.0], [1001.0, -1000.0], [1000.0, -1000.0], [1000.0, -1001.0] ]
  7. ]
  8. }
  9. }

以下は、WKT内のポリゴンの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": "POLYGON ((1000.0 -1001.0, 1001.0 -1001.0, 1001.0 -1000.0, 1000.0 -1000.0, 1000.0 -1001.0))"
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: 'POLYGON ((1000.0 -1001.0, 1001.0 -1001.0, 1001.0 -1000.0, 1000.0 -1000.0, 1000.0 -1001.0))'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location:
  5. "POLYGON ((1000.0 -1001.0, 1001.0 -1001.0, 1001.0 -1000.0, 1000.0 -1000.0, 1000.0 -1001.0))",
  6. },
  7. });
  8. console.log(response);

コンソール

  1. POST /example/_doc
  2. {
  3. "location" : "POLYGON ((1000.0 -1001.0, 1001.0 -1001.0, 1001.0 -1000.0, 1000.0 -1000.0, 1000.0 -1001.0))"
  4. }

最初の配列はポリゴンの外部境界を表し、他の配列は内部形状(”穴”)を表します。以下は、穴のあるポリゴンのGeoJSONの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": {
  5. "type": "polygon",
  6. "coordinates": [
  7. [
  8. [
  9. 1000,
  10. -1001
  11. ],
  12. [
  13. 1001,
  14. -1001
  15. ],
  16. [
  17. 1001,
  18. -1000
  19. ],
  20. [
  21. 1000,
  22. -1000
  23. ],
  24. [
  25. 1000,
  26. -1001
  27. ]
  28. ],
  29. [
  30. [
  31. 1000.2,
  32. -1001.2
  33. ],
  34. [
  35. 1000.8,
  36. -1001.2
  37. ],
  38. [
  39. 1000.8,
  40. -1001.8
  41. ],
  42. [
  43. 1000.2,
  44. -1001.8
  45. ],
  46. [
  47. 1000.2,
  48. -1001.2
  49. ]
  50. ]
  51. ]
  52. }
  53. },
  54. )
  55. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: {
  5. type: 'polygon',
  6. coordinates: [
  7. [
  8. [
  9. 1000,
  10. -1001
  11. ],
  12. [
  13. 1001,
  14. -1001
  15. ],
  16. [
  17. 1001,
  18. -1000
  19. ],
  20. [
  21. 1000,
  22. -1000
  23. ],
  24. [
  25. 1000,
  26. -1001
  27. ]
  28. ],
  29. [
  30. [
  31. 1000.2,
  32. -1001.2
  33. ],
  34. [
  35. 1000.8,
  36. -1001.2
  37. ],
  38. [
  39. 1000.8,
  40. -1001.8
  41. ],
  42. [
  43. 1000.2,
  44. -1001.8
  45. ],
  46. [
  47. 1000.2,
  48. -1001.2
  49. ]
  50. ]
  51. ]
  52. }
  53. }
  54. )
  55. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: {
  5. type: "polygon",
  6. coordinates: [
  7. [
  8. [1000, -1001],
  9. [1001, -1001],
  10. [1001, -1000],
  11. [1000, -1000],
  12. [1000, -1001],
  13. ],
  14. [
  15. [1000.2, -1001.2],
  16. [1000.8, -1001.2],
  17. [1000.8, -1001.8],
  18. [1000.2, -1001.8],
  19. [1000.2, -1001.2],
  20. ],
  21. ],
  22. },
  23. },
  24. });
  25. console.log(response);

コンソール

  1. POST /example/_doc
  2. {
  3. "location" : {
  4. "type" : "polygon",
  5. "coordinates" : [
  6. [ [1000.0, -1001.0], [1001.0, -1001.0], [1001.0, -1000.0], [1000.0, -1000.0], [1000.0, -1001.0] ],
  7. [ [1000.2, -1001.2], [1000.8, -1001.2], [1000.8, -1001.8], [1000.2, -1001.8], [1000.2, -1001.2] ]
  8. ]
  9. }
  10. }

以下は、WKT内の穴のあるポリゴンの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": "POLYGON ((1000.0 1000.0, 1001.0 1000.0, 1001.0 1001.0, 1000.0 1001.0, 1000.0 1000.0), (1000.2 1000.2, 1000.8 1000.2, 1000.8 1000.8, 1000.2 1000.8, 1000.2 1000.2))"
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: 'POLYGON ((1000.0 1000.0, 1001.0 1000.0, 1001.0 1001.0, 1000.0 1001.0, 1000.0 1000.0), (1000.2 1000.2, 1000.8 1000.2, 1000.8 1000.8, 1000.2 1000.8, 1000.2 1000.2))'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location:
  5. "POLYGON ((1000.0 1000.0, 1001.0 1000.0, 1001.0 1001.0, 1000.0 1001.0, 1000.0 1000.0), (1000.2 1000.2, 1000.8 1000.2, 1000.8 1000.8, 1000.2 1000.8, 1000.2 1000.2))",
  6. },
  7. });
  8. console.log(response);

コンソール

  1. POST /example/_doc
  2. {
  3. "location" : "POLYGON ((1000.0 1000.0, 1001.0 1000.0, 1001.0 1001.0, 1000.0 1001.0, 1000.0 1000.0), (1000.2 1000.2, 1000.8 1000.2, 1000.8 1000.8, 1000.2 1000.8, 1000.2 1000.2))"
  4. }

重要な注意事項: WKTは頂点の特定の順序を強制しません。GeoJSONは、外部ポリゴンが反時計回りで、内部形状が時計回りである必要があることを義務付けており、これはOpen Geospatial Consortium (OGC) Simple Feature Access仕様の頂点順序に合致しています。

デフォルトでは、Elasticsearchは頂点を反時計回り(右手ルール)で期待します。データが時計回り(左手ルール)で提供される場合、ユーザーはフィールドマッピング内またはドキュメントに提供されたパラメータとしてorientationパラメータを変更できます。

以下は、ドキュメント内のorientationパラメータを上書きする例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": {
  5. "type": "polygon",
  6. "orientation": "clockwise",
  7. "coordinates": [
  8. [
  9. [
  10. 1000,
  11. 1000
  12. ],
  13. [
  14. 1000,
  15. 1001
  16. ],
  17. [
  18. 1001,
  19. 1001
  20. ],
  21. [
  22. 1001,
  23. 1000
  24. ],
  25. [
  26. 1000,
  27. 1000
  28. ]
  29. ]
  30. ]
  31. }
  32. },
  33. )
  34. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: {
  5. type: 'polygon',
  6. orientation: 'clockwise',
  7. coordinates: [
  8. [
  9. [
  10. 1000,
  11. 1000
  12. ],
  13. [
  14. 1000,
  15. 1001
  16. ],
  17. [
  18. 1001,
  19. 1001
  20. ],
  21. [
  22. 1001,
  23. 1000
  24. ],
  25. [
  26. 1000,
  27. 1000
  28. ]
  29. ]
  30. ]
  31. }
  32. }
  33. )
  34. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: {
  5. type: "polygon",
  6. orientation: "clockwise",
  7. coordinates: [
  8. [
  9. [1000, 1000],
  10. [1000, 1001],
  11. [1001, 1001],
  12. [1001, 1000],
  13. [1000, 1000],
  14. ],
  15. ],
  16. },
  17. },
  18. });
  19. console.log(response);

コンソール

  1. POST /example/_doc
  2. {
  3. "location" : {
  4. "type" : "polygon",
  5. "orientation" : "clockwise",
  6. "coordinates" : [
  7. [ [1000.0, 1000.0], [1000.0, 1001.0], [1001.0, 1001.0], [1001.0, 1000.0], [1000.0, 1000.0] ]
  8. ]
  9. }
  10. }

マルチポイント

以下は、GeoJSONポイントのリストの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": {
  5. "type": "multipoint",
  6. "coordinates": [
  7. [
  8. 1002,
  9. 1002
  10. ],
  11. [
  12. 1003,
  13. 2000
  14. ]
  15. ]
  16. }
  17. },
  18. )
  19. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: {
  5. type: 'multipoint',
  6. coordinates: [
  7. [
  8. 1002,
  9. 1002
  10. ],
  11. [
  12. 1003,
  13. 2000
  14. ]
  15. ]
  16. }
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: {
  5. type: "multipoint",
  6. coordinates: [
  7. [1002, 1002],
  8. [1003, 2000],
  9. ],
  10. },
  11. },
  12. });
  13. console.log(response);

コンソール

  1. POST /example/_doc
  2. {
  3. "location" : {
  4. "type" : "multipoint",
  5. "coordinates" : [
  6. [1002.0, 1002.0], [1003.0, 2000.0]
  7. ]
  8. }
  9. }

以下は、WKTポイントのリストの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": "MULTIPOINT (1002.0 2000.0, 1003.0 2000.0)"
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: 'MULTIPOINT (1002.0 2000.0, 1003.0 2000.0)'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: "MULTIPOINT (1002.0 2000.0, 1003.0 2000.0)",
  5. },
  6. });
  7. console.log(response);

コンソール

  1. POST /example/_doc
  2. {
  3. "location" : "MULTIPOINT (1002.0 2000.0, 1003.0 2000.0)"
  4. }

マルチラインストリング

以下は、GeoJSONラインストリングのリストの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": {
  5. "type": "multilinestring",
  6. "coordinates": [
  7. [
  8. [
  9. 1002,
  10. 200
  11. ],
  12. [
  13. 1003,
  14. 200
  15. ],
  16. [
  17. 1003,
  18. 300
  19. ],
  20. [
  21. 1002,
  22. 300
  23. ]
  24. ],
  25. [
  26. [
  27. 1000,
  28. 100
  29. ],
  30. [
  31. 1001,
  32. 100
  33. ],
  34. [
  35. 1001,
  36. 100
  37. ],
  38. [
  39. 1000,
  40. 100
  41. ]
  42. ],
  43. [
  44. [
  45. 1000.2,
  46. 100.2
  47. ],
  48. [
  49. 1000.8,
  50. 100.2
  51. ],
  52. [
  53. 1000.8,
  54. 100.8
  55. ],
  56. [
  57. 1000.2,
  58. 100.8
  59. ]
  60. ]
  61. ]
  62. }
  63. },
  64. )
  65. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: {
  5. type: 'multilinestring',
  6. coordinates: [
  7. [
  8. [
  9. 1002,
  10. 200
  11. ],
  12. [
  13. 1003,
  14. 200
  15. ],
  16. [
  17. 1003,
  18. 300
  19. ],
  20. [
  21. 1002,
  22. 300
  23. ]
  24. ],
  25. [
  26. [
  27. 1000,
  28. 100
  29. ],
  30. [
  31. 1001,
  32. 100
  33. ],
  34. [
  35. 1001,
  36. 100
  37. ],
  38. [
  39. 1000,
  40. 100
  41. ]
  42. ],
  43. [
  44. [
  45. 1000.2,
  46. 100.2
  47. ],
  48. [
  49. 1000.8,
  50. 100.2
  51. ],
  52. [
  53. 1000.8,
  54. 100.8
  55. ],
  56. [
  57. 1000.2,
  58. 100.8
  59. ]
  60. ]
  61. ]
  62. }
  63. }
  64. )
  65. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: {
  5. type: "multilinestring",
  6. coordinates: [
  7. [
  8. [1002, 200],
  9. [1003, 200],
  10. [1003, 300],
  11. [1002, 300],
  12. ],
  13. [
  14. [1000, 100],
  15. [1001, 100],
  16. [1001, 100],
  17. [1000, 100],
  18. ],
  19. [
  20. [1000.2, 100.2],
  21. [1000.8, 100.2],
  22. [1000.8, 100.8],
  23. [1000.2, 100.8],
  24. ],
  25. ],
  26. },
  27. },
  28. });
  29. console.log(response);

コンソール

  1. POST /example/_doc
  2. {
  3. "location" : {
  4. "type" : "multilinestring",
  5. "coordinates" : [
  6. [ [1002.0, 200.0], [1003.0, 200.0], [1003.0, 300.0], [1002.0, 300.0] ],
  7. [ [1000.0, 100.0], [1001.0, 100.0], [1001.0, 100.0], [1000.0, 100.0] ],
  8. [ [1000.2, 100.2], [1000.8, 100.2], [1000.8, 100.8], [1000.2, 100.8] ]
  9. ]
  10. }
  11. }

以下は、WKTラインストリングのリストの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": "MULTILINESTRING ((1002.0 200.0, 1003.0 200.0, 1003.0 300.0, 1002.0 300.0), (1000.0 100.0, 1001.0 100.0, 1001.0 100.0, 1000.0 100.0), (1000.2 0.2, 1000.8 100.2, 1000.8 100.8, 1000.2 100.8))"
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: 'MULTILINESTRING ((1002.0 200.0, 1003.0 200.0, 1003.0 300.0, 1002.0 300.0), (1000.0 100.0, 1001.0 100.0, 1001.0 100.0, 1000.0 100.0), (1000.2 0.2, 1000.8 100.2, 1000.8 100.8, 1000.2 100.8))'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location:
  5. "MULTILINESTRING ((1002.0 200.0, 1003.0 200.0, 1003.0 300.0, 1002.0 300.0), (1000.0 100.0, 1001.0 100.0, 1001.0 100.0, 1000.0 100.0), (1000.2 0.2, 1000.8 100.2, 1000.8 100.8, 1000.2 100.8))",
  6. },
  7. });
  8. console.log(response);

コンソール

  1. POST /example/_doc
  2. {
  3. "location" : "MULTILINESTRING ((1002.0 200.0, 1003.0 200.0, 1003.0 300.0, 1002.0 300.0), (1000.0 100.0, 1001.0 100.0, 1001.0 100.0, 1000.0 100.0), (1000.2 0.2, 1000.8 100.2, 1000.8 100.8, 1000.2 100.8))"
  4. }

マルチポリゴン

以下は、GeoJSONポリゴンのリストの例です(2番目のポリゴンには穴があります):

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": {
  5. "type": "multipolygon",
  6. "coordinates": [
  7. [
  8. [
  9. [
  10. 1002,
  11. 200
  12. ],
  13. [
  14. 1003,
  15. 200
  16. ],
  17. [
  18. 1003,
  19. 300
  20. ],
  21. [
  22. 1002,
  23. 300
  24. ],
  25. [
  26. 1002,
  27. 200
  28. ]
  29. ]
  30. ],
  31. [
  32. [
  33. [
  34. 1000,
  35. 200
  36. ],
  37. [
  38. 1001,
  39. 100
  40. ],
  41. [
  42. 1001,
  43. 100
  44. ],
  45. [
  46. 1000,
  47. 100
  48. ],
  49. [
  50. 1000,
  51. 100
  52. ]
  53. ],
  54. [
  55. [
  56. 1000.2,
  57. 200.2
  58. ],
  59. [
  60. 1000.8,
  61. 100.2
  62. ],
  63. [
  64. 1000.8,
  65. 100.8
  66. ],
  67. [
  68. 1000.2,
  69. 100.8
  70. ],
  71. [
  72. 1000.2,
  73. 100.2
  74. ]
  75. ]
  76. ]
  77. ]
  78. }
  79. },
  80. )
  81. print(resp)

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: {
  5. type: "multipolygon",
  6. coordinates: [
  7. [
  8. [
  9. [1002, 200],
  10. [1003, 200],
  11. [1003, 300],
  12. [1002, 300],
  13. [1002, 200],
  14. ],
  15. ],
  16. [
  17. [
  18. [1000, 200],
  19. [1001, 100],
  20. [1001, 100],
  21. [1000, 100],
  22. [1000, 100],
  23. ],
  24. [
  25. [1000.2, 200.2],
  26. [1000.8, 100.2],
  27. [1000.8, 100.8],
  28. [1000.2, 100.8],
  29. [1000.2, 100.2],
  30. ],
  31. ],
  32. ],
  33. },
  34. },
  35. });
  36. console.log(response);

コンソール

  1. POST /example/_doc
  2. {
  3. "location" : {
  4. "type" : "multipolygon",
  5. "coordinates" : [
  6. [ [[1002.0, 200.0], [1003.0, 200.0], [1003.0, 300.0], [1002.0, 300.0], [1002.0, 200.0]] ],
  7. [ [[1000.0, 200.0], [1001.0, 100.0], [1001.0, 100.0], [1000.0, 100.0], [1000.0, 100.0]],
  8. [[1000.2, 200.2], [1000.8, 100.2], [1000.8, 100.8], [1000.2, 100.8], [1000.2, 100.2]] ]
  9. ]
  10. }
  11. }

以下は、WKTポリゴンのリストの例です(2番目のポリゴンには穴があります):

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": "MULTIPOLYGON (((1002.0 200.0, 1003.0 200.0, 1003.0 300.0, 1002.0 300.0, 102.0 200.0)), ((1000.0 100.0, 1001.0 100.0, 1001.0 100.0, 1000.0 100.0, 1000.0 100.0), (1000.2 100.2, 1000.8 100.2, 1000.8 100.8, 1000.2 100.8, 1000.2 100.2)))"
  5. },
  6. )
  7. print(resp)

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location:
  5. "MULTIPOLYGON (((1002.0 200.0, 1003.0 200.0, 1003.0 300.0, 1002.0 300.0, 102.0 200.0)), ((1000.0 100.0, 1001.0 100.0, 1001.0 100.0, 1000.0 100.0, 1000.0 100.0), (1000.2 100.2, 1000.8 100.2, 1000.8 100.8, 1000.2 100.8, 1000.2 100.2)))",
  6. },
  7. });
  8. console.log(response);

コンソール

  1. POST /example/_doc
  2. {
  3. "location" : "MULTIPOLYGON (((1002.0 200.0, 1003.0 200.0, 1003.0 300.0, 1002.0 300.0, 102.0 200.0)), ((1000.0 100.0, 1001.0 100.0, 1001.0 100.0, 1000.0 100.0, 1000.0 100.0), (1000.2 100.2, 1000.8 100.2, 1000.8 100.8, 1000.2 100.8, 1000.2 100.2)))"
  4. }

ジオメトリコレクション

以下は、GeoJSONジオメトリオブジェクトのコレクションの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": {
  5. "type": "geometrycollection",
  6. "geometries": [
  7. {
  8. "type": "point",
  9. "coordinates": [
  10. 1000,
  11. 100
  12. ]
  13. },
  14. {
  15. "type": "linestring",
  16. "coordinates": [
  17. [
  18. 1001,
  19. 100
  20. ],
  21. [
  22. 1002,
  23. 100
  24. ]
  25. ]
  26. }
  27. ]
  28. }
  29. },
  30. )
  31. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: {
  5. type: 'geometrycollection',
  6. geometries: [
  7. {
  8. type: 'point',
  9. coordinates: [
  10. 1000,
  11. 100
  12. ]
  13. },
  14. {
  15. type: 'linestring',
  16. coordinates: [
  17. [
  18. 1001,
  19. 100
  20. ],
  21. [
  22. 1002,
  23. 100
  24. ]
  25. ]
  26. }
  27. ]
  28. }
  29. }
  30. )
  31. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: {
  5. type: "geometrycollection",
  6. geometries: [
  7. {
  8. type: "point",
  9. coordinates: [1000, 100],
  10. },
  11. {
  12. type: "linestring",
  13. coordinates: [
  14. [1001, 100],
  15. [1002, 100],
  16. ],
  17. },
  18. ],
  19. },
  20. },
  21. });
  22. console.log(response);

コンソール

  1. POST /example/_doc
  2. {
  3. "location" : {
  4. "type": "geometrycollection",
  5. "geometries": [
  6. {
  7. "type": "point",
  8. "coordinates": [1000.0, 100.0]
  9. },
  10. {
  11. "type": "linestring",
  12. "coordinates": [ [1001.0, 100.0], [1002.0, 100.0] ]
  13. }
  14. ]
  15. }
  16. }

以下は、WKTジオメトリオブジェクトのコレクションの例です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": "GEOMETRYCOLLECTION (POINT (1000.0 100.0), LINESTRING (1001.0 100.0, 1002.0 100.0))"
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.index(
  2. index: 'example',
  3. body: {
  4. location: 'GEOMETRYCOLLECTION (POINT (1000.0 100.0), LINESTRING (1001.0 100.0, 1002.0 100.0))'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location:
  5. "GEOMETRYCOLLECTION (POINT (1000.0 100.0), LINESTRING (1001.0 100.0, 1002.0 100.0))",
  6. },
  7. });
  8. console.log(response);

コンソール

  1. POST /example/_doc
  2. {
  3. "location" : "GEOMETRYCOLLECTION (POINT (1000.0 100.0), LINESTRING (1001.0 100.0, 1002.0 100.0))"
  4. }

エンベロープ

Elasticsearchは、形状を表すために上部左および下部右ポイントの座標からなる envelope タイプをサポートしています。フォーマットは [[minX, maxY], [maxX, minY]] です:

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": {
  5. "type": "envelope",
  6. "coordinates": [
  7. [
  8. 1000,
  9. 100
  10. ],
  11. [
  12. 1001,
  13. 100
  14. ]
  15. ]
  16. }
  17. },
  18. )
  19. print(resp)

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: {
  5. type: "envelope",
  6. coordinates: [
  7. [1000, 100],
  8. [1001, 100],
  9. ],
  10. },
  11. },
  12. });
  13. console.log(response);

コンソール

  1. POST /example/_doc
  2. {
  3. "location" : {
  4. "type" : "envelope",
  5. "coordinates" : [ [1000.0, 100.0], [1001.0, 100.0] ]
  6. }
  7. }

以下は、WKT BBOXフォーマットを使用したエンベロープの例です:

注意: WKT仕様は、次の順序を期待します: minLon, maxLon, maxLat, minLat.

Python

  1. resp = client.index(
  2. index="example",
  3. document={
  4. "location": "BBOX (1000.0, 1002.0, 2000.0, 1000.0)"
  5. },
  6. )
  7. print(resp)

Js

  1. const response = await client.index({
  2. index: "example",
  3. document: {
  4. location: "BBOX (1000.0, 1002.0, 2000.0, 1000.0)",
  5. },
  6. });
  7. console.log(response);

コンソール

  1. POST /example/_doc
  2. {
  3. "location" : "BBOX (1000.0, 1002.0, 2000.0, 1000.0)"
  4. }

インデックス形状のソートと取得

形状の複雑な入力構造とインデックス表現のため、現在のところ形状をソートしたり、そのフィールドを直接取得したりすることはできません。shape 値は、_source フィールドを通じてのみ取得可能です。