形状クエリ

  1. [`````shape````` マッピング](/read/elasticsearch-8-15/aca64c6af64f60cb.md)が必要です。
  2. クエリは、ターゲット形状を定義するための2つの方法をサポートしています。全体の形状定義を提供するか、別のインデックスに事前インデックスされた形状の名前またはIDを参照することができます。両方の形式は、以下に例とともに定義されています。
  3. ## インライン形状定義
  4. `````geo_shape`````クエリに似て、`````shape`````クエリは[GeoJSON](http://geojson.org)または[Well Known Text](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry) (WKT)を使用して形状を表現します。
  5. 次のインデックスを考えてみましょう:
  6. #### Python
  7. ``````python
  8. resp = client.indices.create(
  9. index="example",
  10. mappings={
  11. "properties": {
  12. "geometry": {
  13. "type": "shape"
  14. }
  15. }
  16. },
  17. )
  18. print(resp)
  19. resp1 = client.index(
  20. index="example",
  21. id="1",
  22. refresh="wait_for",
  23. document={
  24. "name": "Lucky Landing",
  25. "geometry": {
  26. "type": "point",
  27. "coordinates": [
  28. 1355.400544,
  29. 5255.530286
  30. ]
  31. }
  32. },
  33. )
  34. print(resp1)
  35. `

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
  14. response = client.index(
  15. index: 'example',
  16. id: 1,
  17. refresh: 'wait_for',
  18. body: {
  19. name: 'Lucky Landing',
  20. geometry: {
  21. type: 'point',
  22. coordinates: [
  23. 1355.400544,
  24. 5255.530286
  25. ]
  26. }
  27. }
  28. )
  29. 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);
  12. const response1 = await client.index({
  13. index: "example",
  14. id: 1,
  15. refresh: "wait_for",
  16. document: {
  17. name: "Lucky Landing",
  18. geometry: {
  19. type: "point",
  20. coordinates: [1355.400544, 5255.530286],
  21. },
  22. },
  23. });
  24. console.log(response1);

コンソール

  1. PUT /example
  2. {
  3. "mappings": {
  4. "properties": {
  5. "geometry": {
  6. "type": "shape"
  7. }
  8. }
  9. }
  10. }
  11. PUT /example/_doc/1?refresh=wait_for
  12. {
  13. "name": "Lucky Landing",
  14. "geometry": {
  15. "type": "point",
  16. "coordinates": [ 1355.400544, 5255.530286 ]
  17. }
  18. }

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

Python

  1. resp = client.search(
  2. index="example",
  3. query={
  4. "shape": {
  5. "geometry": {
  6. "shape": {
  7. "type": "envelope",
  8. "coordinates": [
  9. [
  10. 1355,
  11. 5355
  12. ],
  13. [
  14. 1400,
  15. 5200
  16. ]
  17. ]
  18. },
  19. "relation": "within"
  20. }
  21. }
  22. },
  23. )
  24. print(resp)

Js

  1. const response = await client.search({
  2. index: "example",
  3. query: {
  4. shape: {
  5. geometry: {
  6. shape: {
  7. type: "envelope",
  8. coordinates: [
  9. [1355, 5355],
  10. [1400, 5200],
  11. ],
  12. },
  13. relation: "within",
  14. },
  15. },
  16. },
  17. });
  18. console.log(response);

コンソール

  1. GET /example/_search
  2. {
  3. "query": {
  4. "shape": {
  5. "geometry": {
  6. "shape": {
  7. "type": "envelope",
  8. "coordinates": [ [ 1355.0, 5355.0 ], [ 1400.0, 5200.0 ] ]
  9. },
  10. "relation": "within"
  11. }
  12. }
  13. }
  14. }

事前インデックスされた形状

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

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

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

Python

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

Ruby

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

Js

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

コンソール

  1. PUT /shapes
  2. {
  3. "mappings": {
  4. "properties": {
  5. "geometry": {
  6. "type": "shape"
  7. }
  8. }
  9. }
  10. }
  11. PUT /shapes/_doc/footprint
  12. {
  13. "geometry": {
  14. "type": "envelope",
  15. "coordinates": [ [ 1355.0, 5355.0 ], [ 1400.0, 5200.0 ] ]
  16. }
  17. }
  18. GET /example/_search
  19. {
  20. "query": {
  21. "shape": {
  22. "geometry": {
  23. "indexed_shape": {
  24. "index": "shapes",
  25. "id": "footprint",
  26. "path": "geometry"
  27. }
  28. }
  29. }
  30. }
  31. }

空間関係

以下は利用可能な空間関係演算子の完全なリストです:

  • INTERSECTS - (デフォルト) クエリジオメトリと交差するshapeフィールドを持つすべてのドキュメントを返します。
  • DISJOINT - クエリジオメトリと共通点がないshapeフィールドを持つすべてのドキュメントを返します。
  • WITHIN - クエリジオメトリ内にあるshapeフィールドを持つすべてのドキュメントを返します。
  • CONTAINS - クエリジオメトリを含むshapeフィールドを持つすべてのドキュメントを返します。

未マップを無視

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