ジオシェイプクエリ

geo_shape または geo_point タイプを使用してインデックスされたドキュメントをフィルタリングします。

geo_shape クエリは、geo_shape または geo_point マッピングと同じ インデックス を使用して、クエリシェイプに関連するシェイプを持つドキュメントを見つけます。指定された 空間関係: 交差、包含、内部、または離散のいずれかを使用します。

クエリは、クエリシェイプを定義する2つの方法をサポートしています。全体のシェイプ定義を提供するか、別のインデックスに事前インデックスされたシェイプの名前を参照します。両方の形式は、以下に例とともに定義されています。

インラインシェイプ定義

[geo_point] タイプに似て、geo_shape クエリはシェイプを表すために GeoJSON を使用します。

次のインデックスが geo_shape フィールドとして位置を持つ場合:

Python

  1. resp = client.indices.create(
  2. index="example",
  3. mappings={
  4. "properties": {
  5. "location": {
  6. "type": "geo_shape"
  7. }
  8. }
  9. },
  10. )
  11. print(resp)
  12. resp1 = client.index(
  13. index="example",
  14. refresh=True,
  15. document={
  16. "name": "Wind & Wetter, Berlin, Germany",
  17. "location": {
  18. "type": "point",
  19. "coordinates": [
  20. 13.400544,
  21. 52.530286
  22. ]
  23. }
  24. },
  25. )
  26. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'example',
  3. body: {
  4. mappings: {
  5. properties: {
  6. location: {
  7. type: 'geo_shape'
  8. }
  9. }
  10. }
  11. }
  12. )
  13. puts response
  14. response = client.index(
  15. index: 'example',
  16. refresh: true,
  17. body: {
  18. name: 'Wind & Wetter, Berlin, Germany',
  19. location: {
  20. type: 'point',
  21. coordinates: [
  22. 13.400544,
  23. 52.530286
  24. ]
  25. }
  26. }
  27. )
  28. puts response

Js

  1. const response = await client.indices.create({
  2. index: "example",
  3. mappings: {
  4. properties: {
  5. location: {
  6. type: "geo_shape",
  7. },
  8. },
  9. },
  10. });
  11. console.log(response);
  12. const response1 = await client.index({
  13. index: "example",
  14. refresh: "true",
  15. document: {
  16. name: "Wind & Wetter, Berlin, Germany",
  17. location: {
  18. type: "point",
  19. coordinates: [13.400544, 52.530286],
  20. },
  21. },
  22. });
  23. console.log(response1);

コンソール

  1. PUT /example
  2. {
  3. "mappings": {
  4. "properties": {
  5. "location": {
  6. "type": "geo_shape"
  7. }
  8. }
  9. }
  10. }
  11. POST /example/_doc?refresh
  12. {
  13. "name": "Wind & Wetter, Berlin, Germany",
  14. "location": {
  15. "type": "point",
  16. "coordinates": [ 13.400544, 52.530286 ]
  17. }
  18. }

次のクエリは、Elasticsearch の envelope GeoJSON 拡張を使用してポイントを見つけます:

Python

  1. resp = client.search(
  2. index="example",
  3. query={
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_shape": {
  10. "location": {
  11. "shape": {
  12. "type": "envelope",
  13. "coordinates": [
  14. [
  15. 13,
  16. 53
  17. ],
  18. [
  19. 14,
  20. 52
  21. ]
  22. ]
  23. },
  24. "relation": "within"
  25. }
  26. }
  27. }
  28. }
  29. },
  30. )
  31. print(resp)

Ruby

  1. response = client.search(
  2. index: 'example',
  3. body: {
  4. query: {
  5. bool: {
  6. must: {
  7. match_all: {}
  8. },
  9. filter: {
  10. geo_shape: {
  11. location: {
  12. shape: {
  13. type: 'envelope',
  14. coordinates: [
  15. [
  16. 13,
  17. 53
  18. ],
  19. [
  20. 14,
  21. 52
  22. ]
  23. ]
  24. },
  25. relation: 'within'
  26. }
  27. }
  28. }
  29. }
  30. }
  31. }
  32. )
  33. puts response

Js

  1. const response = await client.search({
  2. index: "example",
  3. query: {
  4. bool: {
  5. must: {
  6. match_all: {},
  7. },
  8. filter: {
  9. geo_shape: {
  10. location: {
  11. shape: {
  12. type: "envelope",
  13. coordinates: [
  14. [13, 53],
  15. [14, 52],
  16. ],
  17. },
  18. relation: "within",
  19. },
  20. },
  21. },
  22. },
  23. },
  24. });
  25. console.log(response);

コンソール

  1. GET /example/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_shape": {
  10. "location": {
  11. "shape": {
  12. "type": "envelope",
  13. "coordinates": [ [ 13.0, 53.0 ], [ 14.0, 52.0 ] ]
  14. },
  15. "relation": "within"
  16. }
  17. }
  18. }
  19. }
  20. }
  21. }

上記のクエリは、同様に geo_point フィールドでクエリできます。

Python

  1. resp = client.indices.create(
  2. index="example_points",
  3. mappings={
  4. "properties": {
  5. "location": {
  6. "type": "geo_point"
  7. }
  8. }
  9. },
  10. )
  11. print(resp)
  12. resp1 = client.index(
  13. index="example_points",
  14. id="1",
  15. refresh=True,
  16. document={
  17. "name": "Wind & Wetter, Berlin, Germany",
  18. "location": [
  19. 13.400544,
  20. 52.530286
  21. ]
  22. },
  23. )
  24. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'example_points',
  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: 'example_points',
  16. id: 1,
  17. refresh: true,
  18. body: {
  19. name: 'Wind & Wetter, Berlin, Germany',
  20. location: [
  21. 13.400544,
  22. 52.530286
  23. ]
  24. }
  25. )
  26. puts response

Js

  1. const response = await client.indices.create({
  2. index: "example_points",
  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: "example_points",
  14. id: 1,
  15. refresh: "true",
  16. document: {
  17. name: "Wind & Wetter, Berlin, Germany",
  18. location: [13.400544, 52.530286],
  19. },
  20. });
  21. console.log(response1);

コンソール

  1. PUT /example_points
  2. {
  3. "mappings": {
  4. "properties": {
  5. "location": {
  6. "type": "geo_point"
  7. }
  8. }
  9. }
  10. }
  11. PUT /example_points/_doc/1?refresh
  12. {
  13. "name": "Wind & Wetter, Berlin, Germany",
  14. "location": [13.400544, 52.530286]
  15. }

同じクエリを使用して、マッチする geo_point フィールドを持つドキュメントが返されます。

Python

  1. resp = client.search(
  2. index="example_points",
  3. query={
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_shape": {
  10. "location": {
  11. "shape": {
  12. "type": "envelope",
  13. "coordinates": [
  14. [
  15. 13,
  16. 53
  17. ],
  18. [
  19. 14,
  20. 52
  21. ]
  22. ]
  23. },
  24. "relation": "intersects"
  25. }
  26. }
  27. }
  28. }
  29. },
  30. )
  31. print(resp)

Ruby

  1. response = client.search(
  2. index: 'example_points',
  3. body: {
  4. query: {
  5. bool: {
  6. must: {
  7. match_all: {}
  8. },
  9. filter: {
  10. geo_shape: {
  11. location: {
  12. shape: {
  13. type: 'envelope',
  14. coordinates: [
  15. [
  16. 13,
  17. 53
  18. ],
  19. [
  20. 14,
  21. 52
  22. ]
  23. ]
  24. },
  25. relation: 'intersects'
  26. }
  27. }
  28. }
  29. }
  30. }
  31. }
  32. )
  33. puts response

Js

  1. const response = await client.search({
  2. index: "example_points",
  3. query: {
  4. bool: {
  5. must: {
  6. match_all: {},
  7. },
  8. filter: {
  9. geo_shape: {
  10. location: {
  11. shape: {
  12. type: "envelope",
  13. coordinates: [
  14. [13, 53],
  15. [14, 52],
  16. ],
  17. },
  18. relation: "intersects",
  19. },
  20. },
  21. },
  22. },
  23. },
  24. });
  25. console.log(response);

コンソール

  1. GET /example_points/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_shape": {
  10. "location": {
  11. "shape": {
  12. "type": "envelope",
  13. "coordinates": [ [ 13.0, 53.0 ], [ 14.0, 52.0 ] ]
  14. },
  15. "relation": "intersects"
  16. }
  17. }
  18. }
  19. }
  20. }
  21. }

コンソール-結果

  1. {
  2. "took" : 17,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : {
  12. "value" : 1,
  13. "relation" : "eq"
  14. },
  15. "max_score" : 1.0,
  16. "hits" : [
  17. {
  18. "_index" : "example_points",
  19. "_id" : "1",
  20. "_score" : 1.0,
  21. "_source" : {
  22. "name": "Wind & Wetter, Berlin, Germany",
  23. "location": [13.400544, 52.530286]
  24. }
  25. }
  26. ]
  27. }
  28. }

事前インデックスされたシェイプ

クエリは、別のインデックスにすでにインデックスされたシェイプを使用することもサポートしています。これは、事前定義されたシェイプのリストがあり、毎回座標を提供するのではなく論理名(例えば ニュージーランド)を使用してリストを参照したい場合に特に便利です。この場合、提供する必要があるのは次のとおりです:

  • id - 事前インデックスされたシェイプを含むドキュメントの ID。
  • index - 事前インデックスされたシェイプがあるインデックスの名前。デフォルトは shapes。
  • path - 事前インデックスされたシェイプを含むパスとして指定されたフィールド。デフォルトは shape。
  • routing - 必要に応じてシェイプドキュメントのルーティング。

以下は、事前インデックスされたシェイプを使用したフィルタの例です:

Python

  1. resp = client.indices.create(
  2. index="shapes",
  3. mappings={
  4. "properties": {
  5. "location": {
  6. "type": "geo_shape"
  7. }
  8. }
  9. },
  10. )
  11. print(resp)
  12. resp1 = client.index(
  13. index="shapes",
  14. id="deu",
  15. document={
  16. "location": {
  17. "type": "envelope",
  18. "coordinates": [
  19. [
  20. 13,
  21. 53
  22. ],
  23. [
  24. 14,
  25. 52
  26. ]
  27. ]
  28. }
  29. },
  30. )
  31. print(resp1)
  32. resp2 = client.search(
  33. index="example",
  34. query={
  35. "bool": {
  36. "filter": {
  37. "geo_shape": {
  38. "location": {
  39. "indexed_shape": {
  40. "index": "shapes",
  41. "id": "deu",
  42. "path": "location"
  43. }
  44. }
  45. }
  46. }
  47. }
  48. },
  49. )
  50. print(resp2)

Ruby

  1. response = client.indices.create(
  2. index: 'shapes',
  3. body: {
  4. mappings: {
  5. properties: {
  6. location: {
  7. type: 'geo_shape'
  8. }
  9. }
  10. }
  11. }
  12. )
  13. puts response
  14. response = client.index(
  15. index: 'shapes',
  16. id: 'deu',
  17. body: {
  18. location: {
  19. type: 'envelope',
  20. coordinates: [
  21. [
  22. 13,
  23. 53
  24. ],
  25. [
  26. 14,
  27. 52
  28. ]
  29. ]
  30. }
  31. }
  32. )
  33. puts response
  34. response = client.search(
  35. index: 'example',
  36. body: {
  37. query: {
  38. bool: {
  39. filter: {
  40. geo_shape: {
  41. location: {
  42. indexed_shape: {
  43. index: 'shapes',
  44. id: 'deu',
  45. path: 'location'
  46. }
  47. }
  48. }
  49. }
  50. }
  51. }
  52. }
  53. )
  54. puts response

Js

  1. const response = await client.indices.create({
  2. index: "shapes",
  3. mappings: {
  4. properties: {
  5. location: {
  6. type: "geo_shape",
  7. },
  8. },
  9. },
  10. });
  11. console.log(response);
  12. const response1 = await client.index({
  13. index: "shapes",
  14. id: "deu",
  15. document: {
  16. location: {
  17. type: "envelope",
  18. coordinates: [
  19. [13, 53],
  20. [14, 52],
  21. ],
  22. },
  23. },
  24. });
  25. console.log(response1);
  26. const response2 = await client.search({
  27. index: "example",
  28. query: {
  29. bool: {
  30. filter: {
  31. geo_shape: {
  32. location: {
  33. indexed_shape: {
  34. index: "shapes",
  35. id: "deu",
  36. path: "location",
  37. },
  38. },
  39. },
  40. },
  41. },
  42. },
  43. });
  44. console.log(response2);

コンソール

  1. PUT /shapes
  2. {
  3. "mappings": {
  4. "properties": {
  5. "location": {
  6. "type": "geo_shape"
  7. }
  8. }
  9. }
  10. }
  11. PUT /shapes/_doc/deu
  12. {
  13. "location": {
  14. "type": "envelope",
  15. "coordinates" : [[13.0, 53.0], [14.0, 52.0]]
  16. }
  17. }
  18. GET /example/_search
  19. {
  20. "query": {
  21. "bool": {
  22. "filter": {
  23. "geo_shape": {
  24. "location": {
  25. "indexed_shape": {
  26. "index": "shapes",
  27. "id": "deu",
  28. "path": "location"
  29. }
  30. }
  31. }
  32. }
  33. }
  34. }
  35. }

空間関係

以下は、ジオフィールドを検索する際に利用可能な空間関係演算子の完全なリストです:

  • INTERSECTS - (デフォルト) クエリジオメトリと交差する geo_shape または geo_point フィールドを持つすべてのドキュメントを返します。
  • DISJOINT - クエリジオメトリと共通点がない geo_shape または geo_point フィールドを持つすべてのドキュメントを返します。
  • WITHIN - クエリジオメトリの内部にある geo_shape または geo_point フィールドを持つすべてのドキュメントを返します。ラインジオメトリはサポートされていません。
  • CONTAINS - クエリジオメトリを含む geo_shape または geo_point フィールドを持つすべてのドキュメントを返します。

マッピングされていないフィールドを無視

true に設定されている場合、ignore_unmapped オプションはマッピングされていないフィールドを無視し、このクエリに対してドキュメントと一致しません。これは、異なるマッピングを持つ複数のインデックスをクエリする際に便利です。false に設定されている場合(デフォルト値)、フィールドがマッピングされていない場合、クエリは例外をスローします。

ノート

  • データが geo_shape フィールドにシェイプの配列としてインデックスされると、配列は1つのシェイプとして扱われます。このため、以下のリクエストは同等です。

Python

  1. resp = client.index(
  2. index="test",
  3. id="1",
  4. document={
  5. "location": [
  6. {
  7. "coordinates": [
  8. 46.25,
  9. 20.14
  10. ],
  11. "type": "point"
  12. },
  13. {
  14. "coordinates": [
  15. 47.49,
  16. 19.04
  17. ],
  18. "type": "point"
  19. }
  20. ]
  21. },
  22. )
  23. print(resp)

Ruby

  1. response = client.index(
  2. index: 'test',
  3. id: 1,
  4. body: {
  5. location: [
  6. {
  7. coordinates: [
  8. 46.25,
  9. 20.14
  10. ],
  11. type: 'point'
  12. },
  13. {
  14. coordinates: [
  15. 47.49,
  16. 19.04
  17. ],
  18. type: 'point'
  19. }
  20. ]
  21. }
  22. )
  23. puts response

Js

  1. const response = await client.index({
  2. index: "test",
  3. id: 1,
  4. document: {
  5. location: [
  6. {
  7. coordinates: [46.25, 20.14],
  8. type: "point",
  9. },
  10. {
  11. coordinates: [47.49, 19.04],
  12. type: "point",
  13. },
  14. ],
  15. },
  16. });
  17. console.log(response);

コンソール

  1. PUT /test/_doc/1
  2. {
  3. "location": [
  4. {
  5. "coordinates": [46.25,20.14],
  6. "type": "point"
  7. },
  8. {
  9. "coordinates": [47.49,19.04],
  10. "type": "point"
  11. }
  12. ]
  13. }

Python

  1. resp = client.index(
  2. index="test",
  3. id="1",
  4. document={
  5. "location": {
  6. "coordinates": [
  7. [
  8. 46.25,
  9. 20.14
  10. ],
  11. [
  12. 47.49,
  13. 19.04
  14. ]
  15. ],
  16. "type": "multipoint"
  17. }
  18. },
  19. )
  20. print(resp)

Ruby

  1. response = client.index(
  2. index: 'test',
  3. id: 1,
  4. body: {
  5. location: {
  6. coordinates: [
  7. [
  8. 46.25,
  9. 20.14
  10. ],
  11. [
  12. 47.49,
  13. 19.04
  14. ]
  15. ],
  16. type: 'multipoint'
  17. }
  18. }
  19. )
  20. puts response

Js

  1. const response = await client.index({
  2. index: "test",
  3. id: 1,
  4. document: {
  5. location: {
  6. coordinates: [
  7. [46.25, 20.14],
  8. [47.49, 19.04],
  9. ],
  10. type: "multipoint",
  11. },
  12. },
  13. });
  14. console.log(response);

コンソール

  1. PUT /test/_doc/1
  2. {
  3. "location":
  4. {
  5. "coordinates": [[46.25,20.14],[47.49,19.04]],
  6. "type": "multipoint"
  7. }
  8. }
  • geo_shape クエリは、geo_shape フィールドが RIGHT (反時計回り) のデフォルト orientation を使用すると仮定します。ポリゴンの向きを参照してください。