지리 검색 (Geo Search)
지리 검색 (Geo Search)
Qdrant에서 검색할 때 좌표값을 범위로 걸러내야 하는 경우가 있어요. 가령 "내 현재 위치에서 반경 1km 안에 있는 매장만 찾아줘"처럼요. 이런 요구를 벡터 유사도만으로는 표현할 수 없어서, 페이로드의 좌표값을 대상으로 하는 지리 조건을 별도로 만들어 두었어요.
지리 조건은 크게 세 가지가 있어요.
- Geo Bounding Box — 사각형 영역 안에 있는 점을 찾아요.
- Geo Radius — 원(circle) 안에 있는 점을 찾아요.
- Geo Polygon — 불규칙한 다각형 영역 안에 있는 점을 찾아요.
이 조건들은 모두 페이로드가 geo 데이터 형식에 맞을 때만 적용할 수 있어요. 좌표는 lon(경도)과 lat(위도) 두 필드를 가진 객체로 저장하면 됩니다.
Geo Bounding Box
사각형 영역으로 걸러낼 때 써요. 왼쪽 위 모서리 좌표를 top_left에, 오른쪽 아래 모서리 좌표를 bottom_right에 넣어요. 이 두 점으로 감싸진 사각형 안에 위치한 location만 매칭돼요.
{
"key": "location",
"geo_bounding_box": {
"bottom_right": {
"lon": 13.455868,
"lat": 52.495862
},
"top_left": {
"lon": 13.403683,
"lat": 52.520711
}
}
}
이 조건은 top_left의 좌표와 bottom_right의 좌표로 만들어지는 직사각형 안에 있는 location들을 매칭해요.
Geo Radius
원형 반경으로 걸러낼 때 써요. center에 원의 중심 좌표를, radius에 반지름(단위는 미터)을 넣으면 중심에서 반지름만큼 떨어진 원 안에 있는 점이 매칭돼요.
{
"key": "location",
"geo_radius": {
"center": {
"lon": 13.403683,
"lat": 52.520711
},
"radius": 1000.0
}
}
위 예시는 중심점에서 반지름 1000미터(1km) 원 안에 있는 location을 찾는 조건이에요. 한 점에 여러 값이 저장되어 있다면, 그중 하나라도 조건에 맞으면 매칭돼요.
Geo Polygon
폴리곤 검색은 나라 경계나 숲 경계처럼 불규칙한 모양의 영역 안에 있는 점을 찾고 싶을 때 유용해요. 예를 들어 호수 안에 섬이 있는 경우를 생각해 볼게요. 이럴 때 섬 부분은 물에 속하지 않으니까, 호수를 나타내는 다각형에 '내부 링(interior ring)'으로 섬을 빼줘야 해요.
폴리곤은 항상 **외부 링(exterior ring)**을 가지며, 필요하면 내부 링을 하나 이상 붙일 수 있어요. 링을 정의할 때는 점들을 시계 방향 또는 반시계 방향 중 하나로 정렬해야 하고, 첫 번째 점과 마지막 점은 반드시 같아야 해요.
현재는 투영되지 않은 전역 좌표(십진수 경도·위도)만 지원하고, 측지 기준계(datum)에는 종속되지 않아요.
{
"key": "location",
"geo_polygon": {
"exterior": {
"points": [
{ "lon": -70.0, "lat": -70.0 },
{ "lon": 60.0, "lat": -70.0 },
{ "lon": 60.0, "lat": 60.0 },
{ "lon": -70.0, "lat": 60.0 },
{ "lon": -70.0, "lat": -70.0 }
]
},
"interiors": [
{
"points": [
{ "lon": -65.0, "lat": -65.0 },
{ "lon": 0.0, "lat": -65.0 },
{ "lon": 0.0, "lat": 0.0 },
{ "lon": -65.0, "lat": 0.0 },
{ "lon": -65.0, "lat": -65.0 }
]
}
]
}
}
매칭 기준은 이렇게 돼요. 점 위치가 폴리곤의 외부 링 경계 안쪽이나 경계선 위에 있으면서, 어떤 내부 링에도 속하지 않을 때 매칭돼요. 물에 있는 점을 찾되 섬 위의 점은 제외하고 싶을 때, 섬을 내부 링으로 만들면 되는 거죠. 한 점에 여러 좌표값이 저장되어 있다면, 그중 하나라도 매칭되면 그 점은 결과 후보에 포함돼요.