xy 쿼리

xy 쿼리

xy 점(xy point)이나 xy 도형(xy shape) 필드를 포함하는 문서를 검색하려면 xy 쿼리를 사용해요.

출처: 문서

본문

공간 관계 (Spatial relations)

xy 쿼리에 xy 도형을 제공하면 문서의 xy 필드는 제공된 도형에 대한 다음과 같은 공간 관계를 사용해 매칭돼요.

  • INTERSECTS (기본값): xy 점이나 xy 도형이 쿼리에 제공된 도형과 교차하는 문서를 매칭해요. (지원 필드 유형: xy_point, xy_shape)
  • DISJOINT: xy 도형이 쿼리에 제공된 도형과 교차하지 않는 문서를 매칭해요. (xy_shape)
  • WITHIN: xy 도형이 쿼리에 제공된 도형 안에 완전히 포함되는 문서를 매칭해요. (xy_shape)
  • CONTAINS: xy 도형이 쿼리에 제공된 도형을 완전히 포함하는 문서를 매칭해요. (xy_shape)

다음 예제들은 xy 도형을 포함하는 문서를 검색하는 방법을 보여줘요. xy 점을 포함하는 문서를 검색하는 방법을 배우려면 "xy 점 쿼리하기 (Querying xy points)" 섹션을 참고하세요.

xy 쿼리에서 도형 정의하기

xy 쿼리에서 도형은 쿼리 시점에 새로운 도형 정의를 제공하거나, 다른 인덱스에 미리 인덱싱된 도형의 이름을 참조하는 두 가지 방식으로 정의할 수 있어요.

새 도형 정의 사용하기

xy 쿼리에 새로운 도형을 제공하려면 xy_shape 필드에 도형을 정의하면 돼요.

다음 예제는 쿼리 시점에 정의된 xy 도형과 일치하는 xy 도형을 포함하는 문서를 검색하는 방법을 보여줘요.

먼저 인덱스를 만들고 geometry 필드를 xy_shape로 매핑해요.

PUT testindex
{
  "mappings": {
    "properties": {
      "geometry": {
        "type": "xy_shape"
      }
    }
  }
}

점이 있는 문서와 다각형이 있는 문서를 각각 인덱싱해요.

PUT testindex/_doc/1
{
  "geometry": { 
    "type": "point",
    "coordinates": [0.5, 3.0]
  }
}
PUT testindex/_doc/2
{
  "geometry" : {
    "type" : "polygon",
    "coordinates" : [
      [[2.5, 6.0],
      [0.5, 4.5], 
      [1.5, 2.0], 
      [3.5, 3.5],
      [2.5, 6.0]]
    ]
  }
}

[[minX, maxY], [maxX, minY]] 형식의 바운딩 사각형인 envelope(둘러싸는 도형)를 정의해요. 이 envelope와 교차하는 xy 점이나 도형을 가진 문서를 검색해 보죠.

GET testindex/_search
{
  "query": {
    "xy_shape": {
      "geometry": {
        "shape": {
          "type": "envelope",
          "coordinates": [ [ 0.0, 6.0], [ 4.0, 2.0] ]
        },
        "relation": "WITHIN"
      }
    }
  }
}

다음 그림은 이 예제를 나타내요. 점과 다각형 모두 바운딩 envelope 안에 있습니다.

응답에는 두 문서가 모두 포함돼요.

{
  "took" : 363,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.0,
    "hits" : [
      {
        "_index" : "testindex",
        "_id" : "1",
        "_score" : 0.0,
        "_source" : {
          "geometry" : {
            "type" : "point",
            "coordinates" : [
              0.5,
              3.0
            ]
          }
        }
      },
      {
        "_index" : "testindex",
        "_id" : "2",
        "_score" : 0.0,
        "_source" : {
          "geometry" : {
            "type" : "polygon",
            "coordinates" : [
              [
                [
                  2.5,
                  6.0
                ],
                [
                  0.5,
                  4.5
                ],
                [
                  1.5,
                  2.0
                ],
                [
                  3.5,
                  3.5
                ],
                [
                  2.5,
                  6.0
                ]
              ]
            ]
          }
        }
      }
    ]
  }
}

미리 인덱싱된 도형 정의 사용하기

xy 쿼리를 구성할 때 다른 인덱스에 미리 인덱싱된 도형의 이름을 참조할 수도 있어요. 이 방법을 사용하면 인덱스 시점에 xy 도형을 정의하고 이름으로 참조할 수 있으며, indexed_shape 객체에 다음 파라미터를 제공해요.

  • index: 미리 인덱싱된 도형이 들어 있는 인덱스의 이름.
  • id: 미리 인덱싱된 도형이 들어 있는 문서의 문서 ID.
  • path: 미리 인덱싱된 도형이 들어 있는 필드의 필드 이름(경로).
  • routing: 미리 인덱싱된 도형이 들어 있는 문서의 라우팅 값. 도형 문서가 사용자 지정 라우팅 값으로 인덱싱된 경우 필수예요.

다음 예제는 다른 인덱스에 미리 인덱싱된 도형의 이름을 참조하는 방법을 보여줘요. 이 예제에서 pre-indexed-shapes 인덱스는 경계를 정의하는 도형을 포함하고, testindex 인덱스는 해당 경계에 대해 위치가 확인되는 도형들을 포함합니다.

먼저 pre-indexed-shapes 인덱스를 만들고 이 인덱스의 geometry 필드를 xy_shape로 매핑해요.

PUT pre-indexed-shapes
{
  "mappings": {
    "properties": {
      "geometry": {
        "type": "xy_shape"
      }
    }
  }
}

경계를 지정하는 envelope를 인덱싱하고 이름을 rectangle로 지정해요.

PUT pre-indexed-shapes/_doc/rectangle
{
  "geometry": {
    "type": "envelope",
    "coordinates" : [ [ 0.0, 6.0], [ 4.0, 2.0] ]
  }
}

testindex 인덱스에 점이 있는 문서와 다각형이 있는 문서를 인덱싱해요.

PUT testindex/_doc/1
{
  "geometry": { 
    "type": "point",
    "coordinates": [0.5, 3.0]
  }
}
PUT testindex/_doc/2
{
  "geometry" : {
    "type" : "polygon",
    "coordinates" : [
      [[2.5, 6.0],
      [0.5, 4.5], 
      [1.5, 2.0], 
      [3.5, 3.5],
      [2.5, 6.0]]
    ]
  }
}

필터를 사용해 testindex 인덱스에서 rectangle과 교차하는 도형이 있는 문서를 검색해요.

GET testindex/_search
{
  "query": {
    "bool": {
      "filter": {
        "xy_shape": {
          "geometry": {
            "indexed_shape": {
              "index": "pre-indexed-shapes",
              "id": "rectangle",
              "path": "geometry"
            }
          }
        }
      }
    }
  }
}

위 쿼리는 기본 공간 관계인 INTERSECTS를 사용하며 점과 다각형을 모두 반환해요.

{
  "took" : 26,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.0,
    "hits" : [
      {
        "_index" : "testindex",
        "_id" : "1",
        "_score" : 0.0,
        "_source" : {
          "geometry" : {
            "type" : "point",
            "coordinates" : [
              0.5,
              3.0
            ]
          }
        }
      },
      {
        "_index" : "testindex",
        "_id" : "2",
        "_score" : 0.0,
        "_source" : {
          "geometry" : {
            "type" : "polygon",
            "coordinates" : [
              [
                [
                  2.5,
                  6.0
                ],
                [
                  0.5,
                  4.5
                ],
                [
                  1.5,
                  2.0
                ],
                [
                  3.5,
                  3.5
                ],
                [
                  2.5,
                  6.0
                ]
              ]
            ]
          }
        }
      }
    ]
  }
}

xy 점 쿼리하기 (Querying xy points)

xy 쿼리를 사용해 xy 점을 포함하는 문서를 검색할 수도 있어요.

point를 xy_point로 하는 매핑을 만들어요.

PUT testindex1
{
  "mappings": {
    "properties": {
      "point": {
        "type": "xy_point"
      }
    }
  }
}

세 개의 점을 인덱싱해요.

PUT testindex1/_doc/1
{
  "point": "1.0, 1.0" 
}
PUT testindex1/_doc/2
{
  "point": "2.0, 0.0" 
}
PUT testindex1/_doc/3
{
  "point": "-2.0, 2.0" 
}

중심이 (0, 0)이고 반지름이 2인 원 안에 있는 점을 검색해 보죠.

GET testindex1/_search
{
  "query": {
    "xy_shape": {
      "point": {
        "shape": {
          "type": "circle",
          "coordinates": [0.0, 0.0],
          "radius": 2
        }
      }
    }
  }
}

xy 점은 기본 공간 관계인 INTERSECTS만 지원하므로 relation 파라미터를 제공할 필요가 없어요.

다음 그림은 이 예제를 나타내요. 점 1과 점 2는 원 안에 있고, 점 3은 원 밖에 있습니다.

응답은 문서 1과 2를 반환해요.

{
  "took" : 575,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.0,
    "hits" : [
      {
        "_index" : "testindex1",
        "_id" : "1",
        "_score" : 0.0,
        "_source" : {
          "point" : "1.0, 1.0"
        }
      },
      {
        "_index" : "testindex1",
        "_id" : "2",
        "_score" : 0.0,
        "_source" : {
          "point" : "2.0, 0.0"
        }
      }
    ]
  }
}

더 알아보기 (Learn more)