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"
}
}
]
}
}