ジオバウンディングボックスクエリ

geo_pointgeo_shape の値がバウンディングボックスと交差する場合に一致します。

次のドキュメントがインデックスされています:

Python

  1. resp = client.indices.create(
  2. index="my_locations",
  3. mappings={
  4. "properties": {
  5. "pin": {
  6. "properties": {
  7. "location": {
  8. "type": "geo_point"
  9. }
  10. }
  11. }
  12. }
  13. },
  14. )
  15. print(resp)
  16. resp1 = client.index(
  17. index="my_locations",
  18. id="1",
  19. document={
  20. "pin": {
  21. "location": {
  22. "lat": 40.12,
  23. "lon": -71.34
  24. }
  25. }
  26. },
  27. )
  28. print(resp1)
  29. resp2 = client.indices.create(
  30. index="my_geoshapes",
  31. mappings={
  32. "properties": {
  33. "pin": {
  34. "properties": {
  35. "location": {
  36. "type": "geo_shape"
  37. }
  38. }
  39. }
  40. }
  41. },
  42. )
  43. print(resp2)
  44. resp3 = client.index(
  45. index="my_geoshapes",
  46. id="1",
  47. document={
  48. "pin": {
  49. "location": {
  50. "type": "polygon",
  51. "coordinates": [
  52. [
  53. [
  54. 13,
  55. 51.5
  56. ],
  57. [
  58. 15,
  59. 51.5
  60. ],
  61. [
  62. 15,
  63. 54
  64. ],
  65. [
  66. 13,
  67. 54
  68. ],
  69. [
  70. 13,
  71. 51.5
  72. ]
  73. ]
  74. ]
  75. }
  76. }
  77. },
  78. )
  79. print(resp3)

Ruby

  1. response = client.indices.create(
  2. index: 'my_locations',
  3. body: {
  4. mappings: {
  5. properties: {
  6. pin: {
  7. properties: {
  8. location: {
  9. type: 'geo_point'
  10. }
  11. }
  12. }
  13. }
  14. }
  15. }
  16. )
  17. puts response
  18. response = client.index(
  19. index: 'my_locations',
  20. id: 1,
  21. body: {
  22. pin: {
  23. location: {
  24. lat: 40.12,
  25. lon: -71.34
  26. }
  27. }
  28. }
  29. )
  30. puts response
  31. response = client.indices.create(
  32. index: 'my_geoshapes',
  33. body: {
  34. mappings: {
  35. properties: {
  36. pin: {
  37. properties: {
  38. location: {
  39. type: 'geo_shape'
  40. }
  41. }
  42. }
  43. }
  44. }
  45. }
  46. )
  47. puts response
  48. response = client.index(
  49. index: 'my_geoshapes',
  50. id: 1,
  51. body: {
  52. pin: {
  53. location: {
  54. type: 'polygon',
  55. coordinates: [
  56. [
  57. [
  58. 13,
  59. 51.5
  60. ],
  61. [
  62. 15,
  63. 51.5
  64. ],
  65. [
  66. 15,
  67. 54
  68. ],
  69. [
  70. 13,
  71. 54
  72. ],
  73. [
  74. 13,
  75. 51.5
  76. ]
  77. ]
  78. ]
  79. }
  80. }
  81. }
  82. )
  83. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my_locations",
  3. mappings: {
  4. properties: {
  5. pin: {
  6. properties: {
  7. location: {
  8. type: "geo_point",
  9. },
  10. },
  11. },
  12. },
  13. },
  14. });
  15. console.log(response);
  16. const response1 = await client.index({
  17. index: "my_locations",
  18. id: 1,
  19. document: {
  20. pin: {
  21. location: {
  22. lat: 40.12,
  23. lon: -71.34,
  24. },
  25. },
  26. },
  27. });
  28. console.log(response1);
  29. const response2 = await client.indices.create({
  30. index: "my_geoshapes",
  31. mappings: {
  32. properties: {
  33. pin: {
  34. properties: {
  35. location: {
  36. type: "geo_shape",
  37. },
  38. },
  39. },
  40. },
  41. },
  42. });
  43. console.log(response2);
  44. const response3 = await client.index({
  45. index: "my_geoshapes",
  46. id: 1,
  47. document: {
  48. pin: {
  49. location: {
  50. type: "polygon",
  51. coordinates: [
  52. [
  53. [13, 51.5],
  54. [15, 51.5],
  55. [15, 54],
  56. [13, 54],
  57. [13, 51.5],
  58. ],
  59. ],
  60. },
  61. },
  62. },
  63. });
  64. console.log(response3);

コンソール

  1. PUT /my_locations
  2. {
  3. "mappings": {
  4. "properties": {
  5. "pin": {
  6. "properties": {
  7. "location": {
  8. "type": "geo_point"
  9. }
  10. }
  11. }
  12. }
  13. }
  14. }
  15. PUT /my_locations/_doc/1
  16. {
  17. "pin": {
  18. "location": {
  19. "lat": 40.12,
  20. "lon": -71.34
  21. }
  22. }
  23. }
  24. PUT /my_geoshapes
  25. {
  26. "mappings": {
  27. "properties": {
  28. "pin": {
  29. "properties": {
  30. "location": {
  31. "type": "geo_shape"
  32. }
  33. }
  34. }
  35. }
  36. }
  37. }
  38. PUT /my_geoshapes/_doc/1
  39. {
  40. "pin": {
  41. "location": {
  42. "type" : "polygon",
  43. "coordinates" : [[[13.0 ,51.5], [15.0, 51.5], [15.0, 54.0], [13.0, 54.0], [13.0 ,51.5]]]
  44. }
  45. }
  46. }

geo_bounding_box フィルターを使用して、バウンディングボックスと交差する geo_point 値を一致させます。ボックスを定義するには、2つの対角のコーナーのジオポイント値を提供します。

Python

  1. resp = client.search(
  2. index="my_locations",
  3. query={
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_bounding_box": {
  10. "pin.location": {
  11. "top_left": {
  12. "lat": 40.73,
  13. "lon": -74.1
  14. },
  15. "bottom_right": {
  16. "lat": 40.01,
  17. "lon": -71.12
  18. }
  19. }
  20. }
  21. }
  22. }
  23. },
  24. )
  25. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my_locations',
  3. body: {
  4. query: {
  5. bool: {
  6. must: {
  7. match_all: {}
  8. },
  9. filter: {
  10. geo_bounding_box: {
  11. 'pin.location' => {
  12. top_left: {
  13. lat: 40.73,
  14. lon: -74.1
  15. },
  16. bottom_right: {
  17. lat: 40.01,
  18. lon: -71.12
  19. }
  20. }
  21. }
  22. }
  23. }
  24. }
  25. }
  26. )
  27. puts response

Js

  1. const response = await client.search({
  2. index: "my_locations",
  3. query: {
  4. bool: {
  5. must: {
  6. match_all: {},
  7. },
  8. filter: {
  9. geo_bounding_box: {
  10. "pin.location": {
  11. top_left: {
  12. lat: 40.73,
  13. lon: -74.1,
  14. },
  15. bottom_right: {
  16. lat: 40.01,
  17. lon: -71.12,
  18. },
  19. },
  20. },
  21. },
  22. },
  23. },
  24. });
  25. console.log(response);

コンソール

  1. GET my_locations/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_bounding_box": {
  10. "pin.location": {
  11. "top_left": {
  12. "lat": 40.73,
  13. "lon": -74.1
  14. },
  15. "bottom_right": {
  16. "lat": 40.01,
  17. "lon": -71.12
  18. }
  19. }
  20. }
  21. }
  22. }
  23. }
  24. }

同じフィルターを使用して、バウンディングボックスと交差する geo_shape 値を一致させます:

Python

  1. resp = client.search(
  2. index="my_geoshapes",
  3. query={
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_bounding_box": {
  10. "pin.location": {
  11. "top_left": {
  12. "lat": 40.73,
  13. "lon": -74.1
  14. },
  15. "bottom_right": {
  16. "lat": 40.01,
  17. "lon": -71.12
  18. }
  19. }
  20. }
  21. }
  22. }
  23. },
  24. )
  25. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my_geoshapes',
  3. body: {
  4. query: {
  5. bool: {
  6. must: {
  7. match_all: {}
  8. },
  9. filter: {
  10. geo_bounding_box: {
  11. 'pin.location' => {
  12. top_left: {
  13. lat: 40.73,
  14. lon: -74.1
  15. },
  16. bottom_right: {
  17. lat: 40.01,
  18. lon: -71.12
  19. }
  20. }
  21. }
  22. }
  23. }
  24. }
  25. }
  26. )
  27. puts response

Js

  1. const response = await client.search({
  2. index: "my_geoshapes",
  3. query: {
  4. bool: {
  5. must: {
  6. match_all: {},
  7. },
  8. filter: {
  9. geo_bounding_box: {
  10. "pin.location": {
  11. top_left: {
  12. lat: 40.73,
  13. lon: -74.1,
  14. },
  15. bottom_right: {
  16. lat: 40.01,
  17. lon: -71.12,
  18. },
  19. },
  20. },
  21. },
  22. },
  23. },
  24. });
  25. console.log(response);

コンソール

  1. GET my_geoshapes/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_bounding_box": {
  10. "pin.location": {
  11. "top_left": {
  12. "lat": 40.73,
  13. "lon": -74.1
  14. },
  15. "bottom_right": {
  16. "lat": 40.01,
  17. "lon": -71.12
  18. }
  19. }
  20. }
  21. }
  22. }
  23. }
  24. }

geo_pointgeo_shape の両方の値を一致させるには、両方のインデックスを検索します:

Python

  1. resp = client.search(
  2. index="my_locations,my_geoshapes",
  3. query={
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_bounding_box": {
  10. "pin.location": {
  11. "top_left": {
  12. "lat": 40.73,
  13. "lon": -74.1
  14. },
  15. "bottom_right": {
  16. "lat": 40.01,
  17. "lon": -71.12
  18. }
  19. }
  20. }
  21. }
  22. }
  23. },
  24. )
  25. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my_locations,my_geoshapes',
  3. body: {
  4. query: {
  5. bool: {
  6. must: {
  7. match_all: {}
  8. },
  9. filter: {
  10. geo_bounding_box: {
  11. 'pin.location' => {
  12. top_left: {
  13. lat: 40.73,
  14. lon: -74.1
  15. },
  16. bottom_right: {
  17. lat: 40.01,
  18. lon: -71.12
  19. }
  20. }
  21. }
  22. }
  23. }
  24. }
  25. }
  26. )
  27. puts response

Js

  1. const response = await client.search({
  2. index: "my_locations,my_geoshapes",
  3. query: {
  4. bool: {
  5. must: {
  6. match_all: {},
  7. },
  8. filter: {
  9. geo_bounding_box: {
  10. "pin.location": {
  11. top_left: {
  12. lat: 40.73,
  13. lon: -74.1,
  14. },
  15. bottom_right: {
  16. lat: 40.01,
  17. lon: -71.12,
  18. },
  19. },
  20. },
  21. },
  22. },
  23. },
  24. });
  25. console.log(response);

コンソール

  1. GET my_locations,my_geoshapes/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_bounding_box": {
  10. "pin.location": {
  11. "top_left": {
  12. "lat": 40.73,
  13. "lon": -74.1
  14. },
  15. "bottom_right": {
  16. "lat": 40.01,
  17. "lon": -71.12
  18. }
  19. }
  20. }
  21. }
  22. }
  23. }
  24. }

クエリオプション

オプション 説明
_name フィルターを識別するためのオプションの名前フィールド
validation_method 無効な緯度または経度を持つジオポイントを受け入れるには IGNORE_MALFORMED に設定し、正しい緯度または経度を推測しようとするには COERCE に設定します。(デフォルトは STRICT です)。

受け入れられるフォーマット

geo_point タイプがジオポイントの異なる表現を受け入れるのと同様に、フィルターもそれを受け入れることができます:

プロパティとしての緯度経度

Python

  1. resp = client.search(
  2. index="my_locations",
  3. query={
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_bounding_box": {
  10. "pin.location": {
  11. "top_left": {
  12. "lat": 40.73,
  13. "lon": -74.1
  14. },
  15. "bottom_right": {
  16. "lat": 40.01,
  17. "lon": -71.12
  18. }
  19. }
  20. }
  21. }
  22. }
  23. },
  24. )
  25. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my_locations',
  3. body: {
  4. query: {
  5. bool: {
  6. must: {
  7. match_all: {}
  8. },
  9. filter: {
  10. geo_bounding_box: {
  11. 'pin.location' => {
  12. top_left: {
  13. lat: 40.73,
  14. lon: -74.1
  15. },
  16. bottom_right: {
  17. lat: 40.01,
  18. lon: -71.12
  19. }
  20. }
  21. }
  22. }
  23. }
  24. }
  25. }
  26. )
  27. puts response

Js

  1. const response = await client.search({
  2. index: "my_locations",
  3. query: {
  4. bool: {
  5. must: {
  6. match_all: {},
  7. },
  8. filter: {
  9. geo_bounding_box: {
  10. "pin.location": {
  11. top_left: {
  12. lat: 40.73,
  13. lon: -74.1,
  14. },
  15. bottom_right: {
  16. lat: 40.01,
  17. lon: -71.12,
  18. },
  19. },
  20. },
  21. },
  22. },
  23. },
  24. });
  25. console.log(response);

コンソール

  1. GET my_locations/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_bounding_box": {
  10. "pin.location": {
  11. "top_left": {
  12. "lat": 40.73,
  13. "lon": -74.1
  14. },
  15. "bottom_right": {
  16. "lat": 40.01,
  17. "lon": -71.12
  18. }
  19. }
  20. }
  21. }
  22. }
  23. }
  24. }

配列としての緯度経度

[lon, lat] 形式、ここでの緯度/経度の順序に注意して、GeoJSON に準拠します。

Python

  1. resp = client.search(
  2. index="my_locations",
  3. query={
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_bounding_box": {
  10. "pin.location": {
  11. "top_left": [
  12. -74.1,
  13. 40.73
  14. ],
  15. "bottom_right": [
  16. -71.12,
  17. 40.01
  18. ]
  19. }
  20. }
  21. }
  22. }
  23. },
  24. )
  25. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my_locations',
  3. body: {
  4. query: {
  5. bool: {
  6. must: {
  7. match_all: {}
  8. },
  9. filter: {
  10. geo_bounding_box: {
  11. 'pin.location' => {
  12. top_left: [
  13. -74.1,
  14. 40.73
  15. ],
  16. bottom_right: [
  17. -71.12,
  18. 40.01
  19. ]
  20. }
  21. }
  22. }
  23. }
  24. }
  25. }
  26. )
  27. puts response

Js

  1. const response = await client.search({
  2. index: "my_locations",
  3. query: {
  4. bool: {
  5. must: {
  6. match_all: {},
  7. },
  8. filter: {
  9. geo_bounding_box: {
  10. "pin.location": {
  11. top_left: [-74.1, 40.73],
  12. bottom_right: [-71.12, 40.01],
  13. },
  14. },
  15. },
  16. },
  17. },
  18. });
  19. console.log(response);

コンソール

  1. GET my_locations/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_bounding_box": {
  10. "pin.location": {
  11. "top_left": [ -74.1, 40.73 ],
  12. "bottom_right": [ -71.12, 40.01 ]
  13. }
  14. }
  15. }
  16. }
  17. }
  18. }

文字列としての緯度経度

lat,lon 形式。

Python

  1. resp = client.search(
  2. index="my_locations",
  3. query={
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_bounding_box": {
  10. "pin.location": {
  11. "top_left": "POINT (-74.1 40.73)",
  12. "bottom_right": "POINT (-71.12 40.01)"
  13. }
  14. }
  15. }
  16. }
  17. },
  18. )
  19. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my_locations',
  3. body: {
  4. query: {
  5. bool: {
  6. must: {
  7. match_all: {}
  8. },
  9. filter: {
  10. geo_bounding_box: {
  11. 'pin.location' => {
  12. top_left: 'POINT (-74.1 40.73)',
  13. bottom_right: 'POINT (-71.12 40.01)'
  14. }
  15. }
  16. }
  17. }
  18. }
  19. }
  20. )
  21. puts response

Js

  1. const response = await client.search({
  2. index: "my_locations",
  3. query: {
  4. bool: {
  5. must: {
  6. match_all: {},
  7. },
  8. filter: {
  9. geo_bounding_box: {
  10. "pin.location": {
  11. top_left: "POINT (-74.1 40.73)",
  12. bottom_right: "POINT (-71.12 40.01)",
  13. },
  14. },
  15. },
  16. },
  17. },
  18. });
  19. console.log(response);

コンソール

  1. GET my_locations/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_bounding_box": {
  10. "pin.location": {
  11. "top_left": "POINT (-74.1 40.73)",
  12. "bottom_right": "POINT (-71.12 40.01)"
  13. }
  14. }
  15. }
  16. }
  17. }
  18. }

よく知られたテキスト (WKT) としてのバウンディングボックス

Python

  1. resp = client.search(
  2. index="my_locations",
  3. query={
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_bounding_box": {
  10. "pin.location": {
  11. "wkt": "BBOX (-74.1, -71.12, 40.73, 40.01)"
  12. }
  13. }
  14. }
  15. }
  16. },
  17. )
  18. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my_locations',
  3. body: {
  4. query: {
  5. bool: {
  6. must: {
  7. match_all: {}
  8. },
  9. filter: {
  10. geo_bounding_box: {
  11. 'pin.location' => {
  12. wkt: 'BBOX (-74.1, -71.12, 40.73, 40.01)'
  13. }
  14. }
  15. }
  16. }
  17. }
  18. }
  19. )
  20. puts response

Js

  1. const response = await client.search({
  2. index: "my_locations",
  3. query: {
  4. bool: {
  5. must: {
  6. match_all: {},
  7. },
  8. filter: {
  9. geo_bounding_box: {
  10. "pin.location": {
  11. wkt: "BBOX (-74.1, -71.12, 40.73, 40.01)",
  12. },
  13. },
  14. },
  15. },
  16. },
  17. });
  18. console.log(response);

コンソール

  1. GET my_locations/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_bounding_box": {
  10. "pin.location": {
  11. "wkt": "BBOX (-74.1, -71.12, 40.73, 40.01)"
  12. }
  13. }
  14. }
  15. }
  16. }
  17. }

ジオハッシュ

Python

  1. resp = client.search(
  2. index="my_locations",
  3. query={
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_bounding_box": {
  10. "pin.location": {
  11. "top_left": "dr5r9ydj2y73",
  12. "bottom_right": "drj7teegpus6"
  13. }
  14. }
  15. }
  16. }
  17. },
  18. )
  19. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my_locations',
  3. body: {
  4. query: {
  5. bool: {
  6. must: {
  7. match_all: {}
  8. },
  9. filter: {
  10. geo_bounding_box: {
  11. 'pin.location' => {
  12. top_left: 'dr5r9ydj2y73',
  13. bottom_right: 'drj7teegpus6'
  14. }
  15. }
  16. }
  17. }
  18. }
  19. }
  20. )
  21. puts response

Js

  1. const response = await client.search({
  2. index: "my_locations",
  3. query: {
  4. bool: {
  5. must: {
  6. match_all: {},
  7. },
  8. filter: {
  9. geo_bounding_box: {
  10. "pin.location": {
  11. top_left: "dr5r9ydj2y73",
  12. bottom_right: "drj7teegpus6",
  13. },
  14. },
  15. },
  16. },
  17. },
  18. });
  19. console.log(response);

コンソール

  1. GET my_locations/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_bounding_box": {
  10. "pin.location": {
  11. "top_left": "dr5r9ydj2y73",
  12. "bottom_right": "drj7teegpus6"
  13. }
  14. }
  15. }
  16. }
  17. }
  18. }

ジオハッシュがバウンディングボックスのエッジを指定するために使用されると、ジオハッシュは長方形として扱われます。バウンディングボックスは、top_left パラメータで指定されたジオハッシュの左上隅に対応するように定義され、その右下は bottom_right パラメータで指定されたジオハッシュの右下として定義されます。

ジオハッシュ全体のエリアに一致するバウンディングボックスを指定するには、ジオハッシュを top_left および bottom_right パラメータの両方で指定できます:

Python

  1. resp = client.search(
  2. index="my_locations",
  3. query={
  4. "geo_bounding_box": {
  5. "pin.location": {
  6. "top_left": "dr",
  7. "bottom_right": "dr"
  8. }
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my_locations',
  3. body: {
  4. query: {
  5. geo_bounding_box: {
  6. 'pin.location' => {
  7. top_left: 'dr',
  8. bottom_right: 'dr'
  9. }
  10. }
  11. }
  12. }
  13. )
  14. puts response

Js

  1. const response = await client.search({
  2. index: "my_locations",
  3. query: {
  4. geo_bounding_box: {
  5. "pin.location": {
  6. top_left: "dr",
  7. bottom_right: "dr",
  8. },
  9. },
  10. },
  11. });
  12. console.log(response);

コンソール

  1. GET my_locations/_search
  2. {
  3. "query": {
  4. "geo_bounding_box": {
  5. "pin.location": {
  6. "top_left": "dr",
  7. "bottom_right": "dr"
  8. }
  9. }
  10. }
  11. }

この例では、ジオハッシュ dr45.0,-78.75 で左上隅を、39.375,-67.5 で右下隅を持つバウンディングボックスクエリを生成します。

頂点

バウンディングボックスの頂点は、top_leftbottom_right または top_rightbottom_left パラメータによって設定できます。値をペアで設定する代わりに、topleftbottomright の単純な名前を使用して、値を個別に設定できます。

Python

  1. resp = client.search(
  2. index="my_locations",
  3. query={
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_bounding_box": {
  10. "pin.location": {
  11. "top": 40.73,
  12. "left": -74.1,
  13. "bottom": 40.01,
  14. "right": -71.12
  15. }
  16. }
  17. }
  18. }
  19. },
  20. )
  21. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my_locations',
  3. body: {
  4. query: {
  5. bool: {
  6. must: {
  7. match_all: {}
  8. },
  9. filter: {
  10. geo_bounding_box: {
  11. 'pin.location' => {
  12. top: 40.73,
  13. left: -74.1,
  14. bottom: 40.01,
  15. right: -71.12
  16. }
  17. }
  18. }
  19. }
  20. }
  21. }
  22. )
  23. puts response

Js

  1. const response = await client.search({
  2. index: "my_locations",
  3. query: {
  4. bool: {
  5. must: {
  6. match_all: {},
  7. },
  8. filter: {
  9. geo_bounding_box: {
  10. "pin.location": {
  11. top: 40.73,
  12. left: -74.1,
  13. bottom: 40.01,
  14. right: -71.12,
  15. },
  16. },
  17. },
  18. },
  19. },
  20. });
  21. console.log(response);

コンソール

  1. GET my_locations/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "match_all": {}
  7. },
  8. "filter": {
  9. "geo_bounding_box": {
  10. "pin.location": {
  11. "top": 40.73,
  12. "left": -74.1,
  13. "bottom": 40.01,
  14. "right": -71.12
  15. }
  16. }
  17. }
  18. }
  19. }
  20. }

ドキュメントごとの複数の位置

フィルターは、ドキュメントごとに複数の位置/ポイントで機能します。単一の位置/ポイントがフィルターに一致すると、そのドキュメントはフィルターに含まれます。

未マップを無視

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

精度に関する注意

ジオポイントは限られた精度を持ち、インデックス時に常に切り捨てられます。クエリ時には、バウンディングボックスの上限が切り捨てられ、下限が切り上げられます。その結果、下限(バウンディングボックスの下部および左側のエッジ)に沿ったポイントは、切り捨て誤差のためにバウンディングボックスに入らない可能性があります。同時に、上限(上部および右側のエッジ)に沿ったポイントは、エッジの外側にわずかに位置していてもクエリによって選択される可能性があります。切り捨て誤差は、緯度で 4.20e-8 度未満、経度で 8.39e-8 度未満である必要があり、これは赤道上であっても 1cm 未満の誤差に相当します。

ジオシェイプも切り捨てのために限られた精度を持っています。バウンディングボックスの下部および左側のエッジに沿ったジオシェイプのエッジは geo_bounding_box クエリと一致しない可能性があります。バウンディングボックスの上部および右側のエッジの外側にわずかに位置するジオシェイプのエッジは、クエリと一致する可能性があります。