지리공간

지리공간 검색으로 게리맨더 길들이기

기본 사항

더 읽어보기 전에 잠시 시간을 내어 다음의 훌륭한 게시물을 읽어보시기 바랍니다. 지리 공간 검색 제 친구이자 동료인 브라이언 케인이 출판한 Couchbase에서: https://www.couchbase.com/blog/geospatial-search-how-do-i-use-thee-let-me-count-the-ways/

먼저 가세요. 기다릴게요.

이제 다시 돌아왔으니 Couchbase의 전체 텍스트 검색 엔진을 활용하는 한 가지 좋은 방법은 지리적 영역을 설명하는 다각형(일반적으로 불규칙한)을 식별하는 일련의 정점을 전달하는 것임을 알 수 있습니다. Brian의 예에서는 10쌍의 위도/경도 점을 사용합니다:

이러한 포인트는 대략 테네시주의 한 지역, 고속도로 남쪽, 국립공원 경계 북쪽, 단일 카운티 내를 경계로 하며, 필요한 분석에 적합하고 요청에 붙여넣기에도 쉽습니다. 이를 감안할 때, Couchbase 전체 텍스트 검색(FTS) 인덱스 엔진은 경계 내부(또는 외부)의 지점과 관련된 모든 필수 데이터 요소를 쉽게 반환할 수 있습니다. (Brian이 자신의 게시물에서 이에 대한 좋은 예를 제시하고 있습니다.)

렌치(또는 어쩌면 렌치 모양의 지구)

하지만 다각형 영역이 매우 상세하고 복잡해서 수천 쌍의 위도/경도 지점을 설명해야 하는 경우라면 어떻게 해야 할까요? 이에 대한 예시가 준비되어 있나요? 예! 50개 주 의회 및/또는 그 대리인들의 노력 덕분에, 미국 의회 선거구 형태로 이와 같은 지역의 예가 많이 있습니다. 그리고 Couchbase N1QL과 FTS 지리공간 검색 덕분에 데이터를 쉽게 관리할 수 있는 수단이 있습니다.

미국 연방 하원 선거구를 정의하려면 평균 8,694개의 정점이 필요합니다. 그 이유는 실용적(모든 선거구는 거의 동일한 수의 시민으로 구성될 것으로 예상됨), 정치적(집권 정당이 해당 지역 유권자들이 선거구 경계를 그대로 유지할 수 있도록 왜곡할 수 있으며 이를 게리맨더링이라고 함), 지리적(많은 선거구가 강, 호수, 해안, 산 및 기타 자연 경계를 부분적으로 기반으로 함) 이유 때문이죠. 지리적으로 가장 복잡한 선거구(즉, 가장 많은 수의 정점을 설명해야 하는 선거구)는 버지니아주 제5 하원의원 선거구로, 무려 40,145개의 위도/경도 쌍을 설명해야 합니다(마치 티라노사우루스가 만연한 것처럼 보입니다). 가장 간단한 것은 422개만 필요한 뉴욕주 제36 연방하원 선거구로, 마치 잠수함이 이리 호수에서 몰래 빠져나가는 것처럼 생겼습니다.

데이터

따라서 대규모로 쿼리를 구현하려면 데이터베이스에서 지리적 포인트를 저장하고 검색해야 합니다. 그리고 포인트는 임베디드 배열의 형태로 발견될 가능성이 높기 때문에 Couchbase의 JSON 문서가 바로 그 티켓입니다. 다음은 그러한 문서의 예입니다:

다각형 점이 이름 없는 단일 요소 배열에 포함되고, 다른 '좌표' 배열에 포함되고, '기하학' 객체에 포함되는 등 데이터의 모양이 왜 이런 식으로 되어 있을까요? 간단한 대답은 때로는 그냥 가지고 있는 데이터로 작업하면 된다는 것입니다. (이 글은 제가 찾을 수 있었던 공개 소스를 기반으로 하고 있는데, 이 소스는 Couchbase로 가져오기가 매우 쉬웠습니다. 그 과정을 설명하는 별도의 포스팅을 작성할 수도 있습니다.) 그리고 데이터가 약간 번거롭기는 하지만, 아래에서 살펴보겠지만 N1QL 언어를 사용하면 필요한 것을 쉽게 검색할 수 있습니다.

다른 데이터 세트는 이 예제의 주요 부분을 구성합니다. 수백만 명의 등록 유권자 목록(이름과 주소는 위조했으니 걱정하지 마세요)과 각 유권자의 소속 정당 및 투표 기록이 포함되어 있습니다. 샘플 문서는 다음과 같습니다:

사용 사례 및 설정

마지막으로 사용 사례를 살펴보겠습니다: 개별 유권자가 전화를 걸었을 때, 국회의원이 그 사람이 자신의 투표구 유권자인지 여부를 어떻게 신속하게 판단할 수 있을까요? FTS와 N1QL로 이 문제를 해결해 보겠습니다.

먼저 FTS 인덱스를 준비해야 합니다. 우리의 경우 유형 필드를 기준으로 모든 문서를 색인화합니다. _유형. 색인을 생성합니다. 이름 필드를 키워드로 설정하고 지리적 필드를 지오포인트로 지정합니다. 콘솔에 표시되는 모습은 다음과 같습니다:

(색인 작성 단계에 대한 자세한 내용은 Brian의 게시물을 참조하세요.)

이 인덱스가 구축되면 일련의 다각형 포인트를 전달하고 일련의 히트를 수신할 수 있습니다. Brian의 안내에 따라 저는 컬을 사용하여 이를 테스트해 보았습니다:

이것은 단순한 다각형 영역에 대한 검색이 이름 목록을 반환할 수 있고 반환한다는 것을 보여줍니다. 이론적으로는 여기서 멈추고 앱(또는 사용자)이 히트 목록을 검색하여 문제의 개별 유권자 이름을 찾을 수 있는지 확인할 수 있습니다. 하지만 더 좋은 방법이 있습니다. 검색 엔진이 검색 범위를 좁히도록 해봅시다. '접속사' 검색을 통해 이 작업을 수행합니다. (접속사는 논리 AND로, 분리 접속사는 논리 OR로 생각하면 됩니다.) 아래는 컬의 예시입니다:

이를 "지오포인트가 다각형 경계 내에 있고 이름이 유권자 이름과 일치하면 적중을 반환합니다."라고 읽을 수 있습니다. 마법처럼 작동하므로 FTS 인덱스가 제대로 정의되었음을 알 수 있습니다.

추출

이제 데이터베이스에서 개별 선거구의 경계를 검색하는 것을 테스트해야 합니다. 첫 번째 단계에서는 단일 선거구에 대해 사용할 가능성이 있는 데이터를 간단히 검사하는 것만으로도 충분합니다:

그러면 다음과 같은 결과가 반환됩니다:

...그리고 1.3MB의 결과 집합을 계속 반복합니다. 이걸 잘라서 붙여넣고 싶지 않은 것도 당연합니다.

우리의 목표는 다음과 같은 모습으로 끝나는 것임을 기억하세요:

이렇게 하면 다음과 같은 결과를 얻을 수 있습니다:

설명이 꽤 많으니 일단 풀어보겠습니다. 우리는 이상적으로 원하는 것이 아니라 현재 가지고 있는 데이터로 작업하고 있으며, 우리가 원하는 다각형 점은 이름 없는 단일 요소 배열에 포함되어 있고, 다른 '좌표' 요소에 포함되어 있으며, '지오메트리' 객체에 포함되어 있다는 것을 기억하세요. 하나씩 풀어나가야 합니다. 먼저 이름 없는 배열 래퍼를 제거해 보겠습니다. 배열의 단일(첫 번째 또는 "0번째") 멤버만 반환하도록 요청하면 됩니다:

이 쿼리에서 반환되는 JSON 객체는 다음과 같습니다:

select value를 사용하여 이를 JSON 객체가 아닌 배열로 변환할 수 있습니다:

이제 우리가 원하는 매우 큰 배열이 다른 배열의 단일 요소로 둘러싸여 있습니다:

해당 반환 세트에서 선택해 보겠습니다:

이렇게 하면 우리의 의지에 따라 구부릴 수 있는 작은 물건이 많이 생깁니다:

이제 유형을 변환하고 연결 작업을 수행해 보겠습니다:

결과 오브젝트는 다음과 같습니다:

이제 선택 값을 사용하여 배열로 받습니다:

그리고 원하는 결과를 얻었습니다:

CTE의 용이성

이 모든 것을 하나로 모으기 위한 마지막 비결은 좋은 방법입니다. 지오포인트가 포함된 배열을 더 큰 SQL 문의 구성 요소로 참조할 수 있는 방법이 필요합니다. 다행히도 N1QL은 공통 테이블 표현식(CTE)이라는 형태로 이를 위한 수단을 제공합니다. CTE는 쿼리에 추가되는 쿼리의 와 함께 절은 쿼리 블록당 한 번씩 평가되며 선택 전에 도입할 수 있습니다. 이것이 바로 우리가 찾고 있는 것입니다:

이제 후속(또는 여러 후속) SQL 문에서 참조할 수 있는 평가된 반환 집합 '지오포인트'에 액세스할 수 있습니다. 완벽합니다. 여기서는 최종 쿼리에 사용됩니다:

여기 있습니다: 간단한 단일 화면 코드 블록으로 지역의 복잡한 경계를 검색하고 이를 N1QL 기반 지리공간 검색의 일부로 활용할 수 있습니다. 이 기술을 사용해보고 지리적 문제를 해결해 보세요.

원래 게시물을 작성해 주신 Brian Kane과 중첩 배열을 풀어주는 데 도움을 주신 Dmitry Lychagin에게 깊은 감사를 드립니다.

이 문서 공유하기
받은 편지함에서 카우치베이스 블로그 업데이트 받기
이 필드는 필수 입력 사항입니다.

작성자

게시자 피터 레알

Peter Reale은 1984년부터 데이터 비즈니스에 종사해 온 Couchbase의 수석 솔루션 엔지니어입니다. 현재 로스앤젤레스에 거주하고 있습니다.

댓글 남기기

카우치베이스 카펠라를 시작할 준비가 되셨나요?

구축 시작

개발자 포털에서 NoSQL을 살펴보고, 리소스를 찾아보고, 튜토리얼을 시작하세요.

카펠라 무료 사용

클릭 몇 번으로 Couchbase를 직접 체험해 보세요. Capella DBaaS는 가장 쉽고 빠르게 시작할 수 있는 방법입니다.

연락하기

카우치베이스 제품에 대해 자세히 알고 싶으신가요? 저희가 도와드리겠습니다.